소스 검색

更新工具类

xiao.qiang 7 달 전
부모
커밋
6972d0d189

+ 7 - 1
README.md

@@ -10,7 +10,12 @@ https://www.genymotion.com/product-desktop/download/
 
 ## 初始化项目
 ```shell
+export HTTP_PROXY=http://127.0.0.1:7899
+export HTTPS_PROXY=http://127.0.0.1:7899
 poetry install
+
+#sudo apt-get install python3-tk
+
 ```
 
 运行android定位器
@@ -60,4 +65,5 @@ point 可以 使用weditor获取到的坐标
 ## 打包
 ```shell
 pyinstaller  --clean  -i assets/logo/32x32.ico test/deepcoin/test02.py 
-```
+```
+

BIN
assets/btn/deepcoin.png


+ 219 - 0
gui/ui.py

@@ -0,0 +1,219 @@
+import logging
+import tempfile
+import tkinter as tk
+from tkinter import Menu, Text, Label, Entry, Button
+from typing import List
+
+from PIL import Image, ImageTk  # 需要安装 Pillow 库
+
+from plat.base.base_control import AbsControl
+
+keys_mapping = {
+    "F1": "开仓滑竿",
+    "F2": "买入/开多",
+    "F3": "平仓滑竿",
+    "F4": "卖出/平多",
+    "F5": "开仓滑竿",
+    "F6": "开仓/开空",
+    "F7": "平仓滑竿",
+    "F8": "卖出/平空"
+}
+
+
+class Application(tk.Tk):
+    """
+    页面布局
+    """
+
+    def __init__(self, controls=None):
+        super().__init__()
+        if controls is None:
+            controls = []
+        self._controls: List[AbsControl] = controls  # 控件
+        self.content_frame = None
+        self.navigation_buttons = None
+        self.navigation_frame = None
+        self.title("群控小助手")
+        self.geometry("1366x768")
+
+        self.create_menu()
+        self.create_navigation()
+        self.create_content_area()
+        self._event_build()
+        self._content_cache = {}  # 缓存内容
+
+        # ===========================
+        # adb 连接
+        # self.adb_serial = tk.StringVar()
+
+    def create_menu(self):
+        menubar = Menu(self)
+        self.config(menu=menubar)
+
+        menu1 = Menu(menubar, tearoff=0)
+        menu1.add_command(label="配置", command=lambda: self.more_click("配置"))
+        menu1.add_command(label="退出", command=self.quit)
+        menubar.add_cascade(label="管理", menu=menu1)
+
+        menu2 = Menu(menubar, tearoff=0)
+
+        def _bind_command(key, label):
+            menu2.add_command(label=label, accelerator=key, command=lambda k=key, v=label: self.more_click(k, v))
+
+        # 循环 keys_mapping 字典 ,生成菜单
+        for key, value in keys_mapping.items():
+            label = f"{value}({key})"
+            logging.info(f"生成菜单项:{label}")
+            _bind_command(key, label)
+
+        # key = "F1"
+        # label = f"开仓滑竿({key})"
+        # menu2.add_command(label=label, accelerator=key, command=lambda: self.more_click(key, label))
+        # key = "F2"
+        # label = f"买入/开多({key})"
+        # menu2.add_command(label=label, accelerator=key, command=lambda: self.more_click(key, label))
+        # key = "F3"
+        # label = f"平仓滑竿({key})"
+        # menu2.add_command(label=label, accelerator=key, command=lambda: self.more_click(key, label))
+        # key = "F4"
+        # label = f"卖出/平多({key})"
+        # menu2.add_command(label=label, accelerator=key, command=lambda: self.more_click(key, label))
+        # key = "F5"
+        # label = f"开仓滑竿({key})"
+        # menu2.add_command(label=label, accelerator=key, command=lambda: self.more_click(key, label))
+        # key = "F6"
+        # label = f"开仓/开空({key})"
+        # menu2.add_command(label=label, accelerator=key, command=lambda: self.more_click(key, label))
+        # key = "F7"
+        # label = f"平仓滑竿({key})"
+        # menu2.add_command(label=label, accelerator=key, command=lambda: self.more_click(key, label))
+        # key = "F8"
+        # label = f"卖出/平空({key})"
+        # menu2.add_command(label=label, accelerator=key, command=lambda: self.more_click(key, label))
+
+        menubar.add_cascade(label="操作", menu=menu2)
+
+        menu1 = Menu(menubar, tearoff=0)
+        menu1.add_command(label="关于", command=lambda: self.more_click('', "关于"))
+        menubar.add_cascade(label="帮助", menu=menu1)
+
+    # 多点击事件,循环调用
+    def more_click(self, key, msg):
+        print(msg)
+
+        for item in self._controls:
+            item.print_log(msg)
+            met_name = f'event_{key.lower()}'
+            if hasattr(item, met_name):
+                evt = getattr(item, met_name)
+                evt()
+            else:
+                print(f"实例 {item.name}没有名为 '{key}' 的方法")
+
+    def add_control(self, control: AbsControl):
+        self._controls.append(control)
+
+    def _event_build(self):
+
+        def _bind_command(key, label):
+            self.bind_all(f"<{key}>", lambda event: self.more_click(key, label))
+
+        for key, value in keys_mapping.items():
+            label = f"{value}({key})"
+            logging.info(f'绑定事件:{label}')
+            _bind_command(key, label)
+
+        # self.bind_all("<F2>", lambda event: self.more_click("买入/开多(F2)"))
+        # self.bind_all("<F3>", lambda event: self.more_click("平仓滑竿(F3)"))
+        # self.bind_all("<F4>", lambda event: self.more_click("卖出/平多(F4)"))
+        # self.bind_all("<F5>", lambda event: self.more_click("开仓滑竿(F5)"))
+        # self.bind_all("<F6>", lambda event: self.more_click("开仓/开空(F6)"))
+        # self.bind_all("<F7>", lambda event: self.more_click("平仓滑竿(F7)"))
+        # self.bind_all("<F8>", lambda event: self.more_click("卖出/平空(F8)"))
+
+    def create_navigation(self):
+        self.navigation_frame = tk.Frame(self, width=150, bg="#f0f0f0")
+        self.navigation_frame.pack(side=tk.LEFT, fill=tk.Y)
+
+        for item in self._controls:
+            # image = Image.open(item['logo'])
+            # photo = ImageTk.PhotoImage(image)
+            button = tk.Button(self.navigation_frame, text=item.name, command=lambda i=item: self.show_content(i), compound=tk.LEFT)
+            button.pack(fill=tk.X, pady=5)
+            # self.navigation_buttons.append(button)
+
+    def test_connect(self, control: AbsControl, serial: str, img: Label = None):
+
+        logging.info(f"测试连接:{serial}")
+
+        control.connect_adb(serial)
+
+        self.flush_screenshot(control, img)
+
+    def flush_screenshot(self, control: AbsControl, image_label: Label):
+        """
+        刷新截图
+        """
+        control.screenshot()
+        try:
+            tmp = tempfile.gettempdir()
+            image = Image.open(f"{tmp}/{control.name}.png")
+            w = 380
+            image = image.resize((w, w * 16 // 9))
+            logging.info(f"刷新截图:{image}")
+            photo = ImageTk.PhotoImage(image)
+            image_label.config(image=photo)
+            image_label.image = photo  # 保持对图片的引用
+        except FileNotFoundError:
+            logging.error(f"图片不存在")
+        pass
+
+    def create_content_area(self):
+        self.content_frame = tk.Frame(self)
+        self.content_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
+
+    def show_content(self, item: AbsControl):
+        print(f"---> {item.name},{self._content_cache}")
+        for key, value in self._content_cache.items():
+            if key != item.name:
+                value.pack_forget()
+        if item.name in self._content_cache:
+            content = self._content_cache[item.name]
+            content.pack(fill=tk.BOTH, expand=True)
+        else:
+            content = tk.Frame(self.content_frame)
+            content.pack(fill=tk.BOTH, expand=True)
+
+            # 表单区域
+            form_frame = tk.Frame(content)
+            form_frame.pack(side=tk.TOP, fill=tk.X)
+            # 设置第二列的权重
+            # form_frame.columnconfigure(1, weight=1)
+
+            tk.Label(form_frame, text="连接:").grid(row=0, column=0, sticky="w")
+            name_entry = Entry(form_frame, width=100)
+            name_entry.grid(row=0, column=1)
+            name_entry.insert(0, '127.0.0.1:6555')
+            # 图片预览区域
+            image_label = Label(content, width=200, height=380)
+            Button(form_frame, text="测试连接", command=lambda n=name_entry: self.test_connect(item, name_entry.get(), image_label)).grid(row=0, column=1, sticky="e")
+            Button(form_frame, text="查看手机", command=lambda n=name_entry: self.flush_screenshot(item, image_label)).grid(row=0, column=2, sticky="e")
+
+            # tk.Label(form_frame, text="年龄:").grid(row=1, column=0, sticky="w")
+            # age_entry = Entry(form_frame)
+            # age_entry.grid(row=1, column=1)
+            #
+            # Button(form_frame, text="保存").grid(row=2, column=1, sticky="e")
+
+            # 日志区域
+            log_text = Text(content, height=10)
+            log_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
+            log_text.insert(tk.END, f"导航 {item} 被点击\n")
+
+            item.set_log_func(lambda msg: log_text.insert(tk.END, f"{msg}\n"))
+
+            image_label.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
+
+            # self.flush_screenshot(image_label)
+
+            self._content_cache[item.name] = content  # 缓存内容

+ 10 - 0
main.py

@@ -0,0 +1,10 @@
+import logging
+
+from gui.ui import Application
+from plat.deepcoin_control import DeepCoinControl
+logging.basicConfig(level=logging.INFO, force=True)  # 设置日志级别
+if __name__ == "__main__":
+    app = Application(
+        controls=[DeepCoinControl('DeepCoin')]
+    )
+    app.mainloop()

+ 0 - 158
plat/base/abs_ui.py

@@ -1,158 +0,0 @@
-# 定义抽象类
-import json
-import logging
-from abc import ABC, abstractmethod
-
-import uiautomator2 as u2
-
-
-class AbsUi(ABC):
-
-    def __init__(self, serial: str):
-        """
-        :param serial: 设备序列号。 例如 127.0.0.1:6555
-            可以通过 `adb devices`  获取
-        """
-        # u2.logger.setLevel(logging.DEBUG)
-
-        # 屏幕高度
-        self.height = 0
-        # 屏幕宽度
-        self.width = 0
-        self.d = u2.connect(serial)
-
-        self._points = {}
-
-        self.point_path = 'point.json'
-        self.enable_click_monitor()
-        self._func = []
-
-    def enable_click_monitor(self):
-        """
-        启用点击监控,在屏幕上显示点击位置
-        """
-        # self.d.settings['operation_delay'] = (0.5, 0.5)  # 增加操作延迟以便观察
-        self.d.debug = True
-        self.d.toast.show('点击监控已启用')  # 显示提示
-
-        # 确保有悬浮窗权限
-        self.d.set_fastinput_ime(True)  # 启用ime
-        self.d.show_float_window(True)  # 显示悬浮窗
-
-        # 可选:打开开发者选项中的"指针位置"
-        self.d.shell('settings put system pointer_location 1')
-
-    def to_top_swipe(self):
-        """
-        滑动到屏幕最顶部,通过多次滑动确保到达顶部
-        """
-        width, height = self.get_screen_size()
-        # 循环滑动直到无法继续滑动
-        for _ in range(3):
-            self.d.swipe(width // 2, height * 0.8, width // 2, height)  # 向上滑动
-            # 短暂等待确保滑动完成
-            self.d.sleep(0.1)
-
-    def click_point(self, x: int, y: int):
-        """
-        点击指定坐标
-        :param x: x坐标
-        :param y: y坐标
-        """
-        self.d.click(x, y)
-
-    def click_xpath(self, xpath: str):
-        """
-        点击指定xpath
-        """
-        el = self.d.xpath(xpath).get()
-        if el:
-            el.click()
-        else:
-            logging.warning(f"未找到元素: {xpath}")
-
-    def to_next_swipe(self):
-        """
-        向上滑动一屏
-        """
-        width, height = self.get_screen_size()
-        # 从屏幕下方向上滑动到顶部
-        self.d.swipe(width // 2, height * 0.8, width // 2, height * 0.2, duration=0.1)  # 向上滑动
-
-    def get_screen_size(self):
-        """
-        获取屏幕尺寸,宽度和高度
-        """
-        self.width, self.height = self.d.window_size()
-        logging.info(f"屏幕尺寸: {self.width}x{self.height}")
-        return self.width, self.height
-
-    def drag_slider_ext(self, start_x: int, start_y: int, end_x: int, end_y: int, steps: int = 50):
-        """
-        精确拖动滑块
-        :param start_x: 起始x坐标
-        :param start_y: 起始y坐标
-        :param end_x: 结束x坐标
-        :param end_y: 结束y坐标
-        :param steps: 步数,值越大滑动越平滑
-        """
-        self.d.swipe_ext(start_x, start_y, end_x, end_y, steps)
-
-    def add_point(self, point=None):
-        """
-        添加坐标点
-        point = {
-                "name": "",
-                "x": 0,
-                "y": 0,
-                "desc": "",
-                "xpath": ""
-            }
-        """
-        logging.info("保存坐标点: %s", point)
-        self._points[point['name']] = point
-
-    def add_func(self, func):
-        """
-        添加坐标点采集函数
-        """
-        self._func.append(func)
-
-    def save_point(self):
-        """
-        保存坐标
-        """
-        self.to_top_swipe()
-        self.d.sleep(2)
-
-        for func in self._func:
-            func()
-
-        __tmp__ = {}
-        for k, v in self._points.items():
-            __tmp__[k] = v
-
-        with open(self.point_path, "w", encoding="utf-8") as f:
-            json.dump(__tmp__, f, ensure_ascii=False, indent=4)
-
-    def get_point(self, info: dict):
-        """
-        获取坐标点
-        info 数据结构
-        {
-            "name": "btn_mairu_kaiduo",
-            "desc": "买入/开多",
-            "xpath": '//*[@content-desc="买入/开多"]'
-
-        """
-        el = self.d.xpath(info['xpath']).get()
-        x, y = el.center()
-        self.add_point({
-            "name": info['name'],
-            "x": x,
-            "y": y,
-            "desc": info['desc'],
-            "xpath": info['xpath'],
-        })
-
-        return x, y

+ 329 - 0
plat/base/base_control.py

@@ -0,0 +1,329 @@
+# 定义抽象类
+import json
+import logging
+import tempfile
+from abc import ABC, abstractmethod
+
+import uiautomator2 as u2
+
+
+class AbsControl(ABC):
+
+    def __init__(self, name: str):
+        """
+        # :param : 设备序列号。 例如 127.0.0.1:6555
+        #     可以通过 `adb devices`  获取
+        """
+        # u2.logger.setLevel(logging.DEBUG)
+        # 名称
+        self.name = name
+
+        self.d = None
+        # 屏幕高度
+        self.height = 0
+        # 屏幕宽度
+        self.width = 0
+
+        self._points = {}
+
+        self.point_path = 'point.json'
+
+        self._func = []
+
+        self._log_func = None
+
+    def connect_adb(self, serial: str):
+        """
+        连接设备
+        """
+        self.d = u2.connect(serial)
+
+        self.enable_click_monitor()
+
+        #     如果连接成功,返回截图,否则返回None
+
+    def screenshot(self):
+        """
+        截图
+        """
+        # 获取系统/tmp路径
+        tmp = tempfile.gettempdir()
+        return self.d.screenshot(f"{tmp}/{self.name}.png")
+
+    def enable_click_monitor(self):
+        """
+        启用点击监控,在屏幕上显示点击位置
+        """
+        # self.d.settings['operation_delay'] = (0.5, 0.5)  # 增加操作延迟以便观察
+        self.d.debug = True
+        self.d.toast.show('点击监控已启用')  # 显示提示
+
+        # 确保有悬浮窗权限
+        self.d.set_fastinput_ime(True)  # 启用ime
+        self.d.show_float_window(True)  # 显示悬浮窗
+
+        # 可选:打开开发者选项中的"指针位置"
+        self.d.shell('settings put system pointer_location 1')
+
+    def to_top_swipe(self, sleep=0.1, times=2):
+        """
+        滑动到屏幕最顶部,通过多次滑动确保到达顶部
+        :param sleep: 滑动后等待时间
+        :param times: 滑动次数
+        :return:
+        """
+        width, height = self.get_screen_size()
+        # 循环滑动直到无法继续滑动
+        for _ in range(times):
+            self.d.swipe(width // 2, height * 0.8, width // 2, height)  # 向上滑动
+            # 短暂等待确保滑动完成
+            self.d.sleep(sleep)
+
+    def click_point(self, x: int, y: int):
+        """
+        点击指定坐标
+        :param x: x坐标
+        :param y: y坐标
+        """
+        self.d.click(x, y)
+
+    def click_xpath(self, xpath: str):
+        """
+        点击指定xpath
+        """
+        el = self.d.xpath(xpath).get()
+        if el:
+            el.click()
+        else:
+            logging.warning(f"未找到元素: {xpath}")
+
+    def to_next_swipe(self, sleep=0.1):
+        """
+        向上滑动一屏
+        """
+        width, height = self.get_screen_size()
+        # 从屏幕下方向上滑动到顶部
+        self.d.swipe(width // 2, height * 0.8, width // 2, height * 0.2)  # 向上滑动
+
+        # 短暂等待确保滑动完成
+        self.d.sleep(sleep)
+
+    def get_screen_size(self):
+        """
+        获取屏幕尺寸,宽度和高度
+        """
+        self.width, self.height = self.d.window_size()
+        logging.info(f"屏幕尺寸: {self.width}x{self.height}")
+        return self.width, self.height
+
+    def drag_slider_ext(self, start_x: int, start_y: int, end_x: int, end_y: int, steps: int = 50):
+        """
+        精确拖动滑块
+        :param start_x: 起始x坐标
+        :param start_y: 起始y坐标
+        :param end_x: 结束x坐标
+        :param end_y: 结束y坐标
+        :param steps: 步数,值越大滑动越平滑
+        """
+        self.d.swipe_ext(start_x, start_y, end_x, end_y, steps)
+
+    def add_point(self, point=None):
+        """
+        添加坐标点
+        point = {
+                "name": "",
+                "x": 0,
+                "y": 0,
+                "desc": "",
+                "xpath": ""
+            }
+        """
+        logging.info("保存坐标点: %s", point)
+        self._points[point['name']] = point
+
+    def print_log(self, msg):
+        """
+        打印日志
+        """
+        logging.info(f'>>111>{msg}')
+        print(f'>222>>{msg},{self._log_func}')
+        if self._log_func:
+            self._log_func(msg)
+
+    def add_func(self, func):
+        """
+        添加坐标点采集函数
+        """
+        self._func.append(func)
+
+    def set_log_func(self, func):
+        """
+        添加日志函数
+        """
+        self._log_func = func
+
+    def save_point(self):
+        """
+        保存坐标
+        """
+        self.to_top_swipe()
+        self.d.sleep(2)
+
+        for func in self._func:
+            func()
+
+        __tmp__ = {}
+        for k, v in self._points.items():
+            __tmp__[k] = v
+
+        with open(self.point_path, "w", encoding="utf-8") as f:
+            json.dump(__tmp__, f, ensure_ascii=False, indent=4)
+
+    def get_point(self, info: dict):
+        """
+        获取坐标点
+     :param info:  数据结构
+        {
+            "name": "btn_mairu_kaiduo",
+            "desc": "买入/开多",
+            "xpath": '//*[@content-desc="买入/开多"]'
+        }
+        :return: x, y, el
+        """
+        x, y, el = self.get_point_by_xpath(info['xpath'])
+
+        self.add_point({
+            "name": info['name'],
+            "x": x,
+            "y": y,
+            "desc": info['desc'],
+            "xpath": info['xpath'],
+        })
+        return x, y, el
+
+    def get_point_by_xpath(self, xpath: str):
+        """
+        :param xpath: xpath
+        获取坐标第一个匹配的点
+        info 数据结构
+        :return: x, y, el
+        """
+        el = self.d.xpath(xpath).get()
+        x, y = el.center()
+
+        return x, y, el
+
+    def get_points_by_xpath(self, xpath: str):
+        """
+        获取所有坐标点
+        info 数据结构
+        """
+        els = self.d.xpath(xpath).all()
+
+        items = []
+
+        for el in els:
+            x, y = el.center()
+            items.append((x, y, el))
+
+        return items
+
+    def check_element_exists(self, xpath: str, timeout: float = 0.05) -> bool:
+        """
+        判断指定XPath的元素是否存在
+
+        :param xpath: 元素的XPath
+        :param timeout: 超时时间(秒)
+        :return: 是否存在
+        """
+        self.d.sleep(timeout)
+        return self.d.xpath(xpath).exists
+
+    def input_xpath(self, xpath: str, text: str, clear: bool = True):
+        """
+        给指定xpath的输入框输入文本
+
+        :param xpath: 输入框的xpath
+        :param text: 要输入的文本
+        :param clear: 输入前是否清空原有内容
+        """
+        element = self.d.xpath(xpath).get()
+        if element:
+            if clear:
+                element.text.set_text("")  # 清空原有内容
+            element.set_text(text)  # 输入新内容
+        else:
+            logging.warning(f"未找到输入框: {xpath}")
+
+    def input_by_position(self, x: int, y: int, text: str, clear: bool = True):
+        """
+        通过坐标点击并在输入框中输入文本
+
+        :param x: 输入框x坐标
+        :param y: 输入框y坐标
+        :param text: 要输入的文本
+        :param clear: 是否清空原有内容
+        """
+        self.click_point(x, y)  # 先点击获取焦点
+        if clear:
+            self.d.clear_text()  # 清空原有内容
+        self.d.send_keys(text)  # 输入新文本
+
+    @abstractmethod
+    def event_f1(self):
+        """
+        F1  开仓界面,仓位滑竿百分比(30-60)
+        """
+        pass
+
+    @abstractmethod
+    def event_f2(self):
+        """
+        F2 确认开仓,开多 限价职中间数值
+        检查撤销限价委托单
+        """
+        pass
+
+    @abstractmethod
+    def event_f3(self):
+        """
+        F3 平仓界面 平空,仓位滑竿百分比(90-100)确认开仓,限价职中间数值
+        """
+        pass
+
+    @abstractmethod
+    def event_f4(self):
+        """
+        F4   确认平仓 平多 限价取中间数值 检查撤销限价委托单
+        """
+        pass
+
+    @abstractmethod
+    def event_f5(self):
+        """
+        F5 开仓界面 仓位滑竿百分比(30-60)
+        """
+        pass
+
+    @abstractmethod
+    def event_f6(self):
+        """
+        F6 确认开仓, 开空 限价值中间数值
+        检查撤销限价委托单
+        """
+        pass
+
+    @abstractmethod
+    def event_f7(self):
+        """
+        F7    平仓界面二仓位滑竿百分比(90-100)
+        """
+        pass
+
+    @abstractmethod
+    def event_f8(self):
+        """
+        F8 确认平仓, 平空 限价职中间数值
+        检查撤销限价委托单
+        """
+        pass

+ 0 - 147
plat/deepcoin/point_collection.py

@@ -1,147 +0,0 @@
-# from utils.point_utils import UiFactory
-import logging
-
-from plat.base.abs_ui import AbsUi
-
-
-class PointCollection(AbsUi):
-
-    def __init__(self, serial: str):
-        super().__init__(serial)
-        self.point_path = '../../assets/point/deepcoin_point.json'
-        self.add_func(self.btn_jiao_yi)
-        self.add_func(self.btn_mairu_kaiduo)
-        self.add_func(self.btn_shijia_quanping)
-
-    def btn_jiao_yi(self):
-        return self.get_point({
-            "name": "btn_jiao_yi",
-            "desc": "交易按钮",
-            "xpath": '//*[@content-desc="交易"]'
-        })
-
-    def btn_mairu_kaiduo(self):
-        return self.get_point({
-            "name": "btn_mairu_kaiduo",
-            "desc": "买入/开多",
-            "xpath": '//*[@content-desc="买入/开多"]'
-        })
-
-    def btn_shijia_quanping(self):
-        self.to_next_swipe()
-        return self.get_point({
-            "name": "btn_shijia_quanping",
-            "desc": "买入/开多",
-            "xpath": '//*[@content-desc="市价全平"]'
-        })
-
-    def btn_kaichang(self):
-        return self.get_point({
-            "name": "btn_kaichang",
-            "desc": "开仓",
-            "xpath": '//*[@content-desc="开仓"]'
-        })
-
-    def slider_baozhengjin(self, offset=0, sleep=0.1):
-        """
-        保证金滑块
-           :param sleep 休眠
-           :param offset 价格偏移量 默认取50% x=368 每偏移69 向下多一个 偏移-69向上多一个 取值范围 [-2,2]
-        坐标: 0% 230  25% 299  50% 368  75% 437  100% 506
-
-        """
-        self.to_top_swipe()
-        self.d.sleep(0.1)
-        x, y = self.btn_mairu_kaiduo()
-
-        x1 = x + offset * 69
-        y1 = y - 140
-        logging.info(f"开多坐标: ({x},{y})")
-        logging.info(f"保证金50%坐标: ({x1},{y1})")
-
-        self.click_point(x1, y1)
-        self.d.sleep(sleep)
-
-    def click_kaicang(self):
-        """
-        开仓
-        """
-        self.click_xpath('//*[@content-desc="开仓"]')
-
-    def click_pingchang(self, sleep=0.1):
-        """
-        开仓
-        :param sleep: 等待时间
-        """
-        self.click_xpath('//*[@content-desc="平仓"]')
-        self.d.sleep(sleep)
-
-    def select_weituo_xianjia(self):
-        """
-        选择限价委托
-
-        """
-        x, y = self.btn_kaichang()
-        logging.info(f"开仓按钮坐标: ({x},{y})")
-        x1 = x + 50
-        y1 = y + 55
-        logging.info(f"选择委托框: ({x1},{y1})")
-        self.click_point(x1, y1)
-        x2 = x1
-        y2 = y1 + 100
-        self.d.sleep(0.2)
-        logging.info(f"选择限价委托: ({x2},{y2})")
-        self.click_point(x2, y2)
-
-    def click_price_red(self, offset=0):
-        """
-        点击价格 开多 平空, 点击红色价格
-
-        :param offset 价格偏移量 默认取第5个, 每偏移20 向下多一个 偏移-20 向上多一个 取值范围 [-4,4]
-        """
-        self.select_weituo_xianjia()
-        self.d.sleep(0.1)
-
-        x1 = 50
-        y1 = 330 + offset * 20
-        logging.info(f"选择价格: ({x1},{y1})")
-        self.click_point(x1, y1)
-
-    def click_price_green(self, offset=0):
-        """
-        点击价格 开空 平多, 点击红色价格
-        :param offset 价格偏移量 默认取第5个, 每偏移20 向下多一个,偏移-20 向上多一个
-        """
-
-        self.select_weituo_xianjia()
-
-        self.d.sleep(0.1)
-
-        x1 = 50
-        y1 = 330 + offset
-        logging.info(f"选择价格: ({x1},{y1})")
-        self.click_point(x1, y1)
-
-    def click_mairu_kaiduo(self):
-        """
-        买入开多
-        """
-        self.click_xpath('//*[@content-desc="买入/开多"]')
-
-    def click_mairu_pingkong(self):
-        """
-        买入平空
-        """
-        self.click_xpath('//*[@content-desc="买入/平空"]')
-
-    def click_maichu_kaikong(self):
-        """
-        卖出开空
-        """
-        self.click_xpath('//*[@content-desc="卖出/开空"]')
-
-    def click_maichu_pingduo(self):
-        """
-        卖出平多
-        """
-        self.click_xpath('//*[@content-desc="卖出/平多"]')

+ 329 - 0
plat/deepcoin_control.py

@@ -0,0 +1,329 @@
+# from utils.point_utils import UiFactory
+import logging
+
+from plat.base.base_control import AbsControl
+
+
+class DeepCoinControl(AbsControl):
+
+    def __init__(self, serial: str):
+        super().__init__(serial)
+        self.point_path = '../../assets/point/deepcoin_point.json'
+        self.add_func(self.btn_jiao_yi)
+        self.add_func(self.btn_mairu_kaiduo)
+        self.add_func(self.btn_shijia_quanping)
+
+    def btn_jiao_yi(self):
+        return self.get_point({
+            "name": "btn_jiao_yi",
+            "desc": "交易按钮",
+            "xpath": '//*[@content-desc="交易"]'
+        })
+
+    def btn_mairu_kaiduo(self):
+        return self.get_point({
+            "name": "btn_mairu_kaiduo",
+            "desc": "买入/开多",
+            "xpath": '//*[@content-desc="买入/开多"]'
+        })
+
+    def btn_mairu_pingkong(self):
+        return self.get_point({
+            "name": "btn_mairu_pingkong",
+            "desc": "买入/平空",
+            "xpath": '//*[@content-desc="买入/平空"]'
+        })
+
+    def btn_shijia_quanping(self):
+        self.to_next_swipe()
+        return self.get_point({
+            "name": "btn_shijia_quanping",
+            "desc": "买入/开多",
+            "xpath": '//*[@content-desc="市价全平"]'
+        })
+
+    def btn_kaichang(self):
+        return self.get_point({
+            "name": "btn_kaichang",
+            "desc": "开仓",
+            "xpath": '//*[@content-desc="开仓"]'
+        })
+
+    def btn_gengdan(self):
+        """
+        跟单(n) 按钮 坐标
+        """
+        return self.get_point({
+            "name": "btn_gengdan",
+            "desc": "跟单",
+            "xpath": '//*[starts-with(@content-desc, "跟单(")]'
+        })
+
+    def btn_weituo(self):
+        """
+        委托(n) 按钮 坐标
+        FIXME 委托按钮点击2次回出现切换委托界面
+
+        """
+        return self.get_point({
+            "name": "btn_weituo",
+            "desc": "委托",
+            "xpath": '//*[starts-with(@content-desc, "委托(")]'
+        })
+
+    def btn_yijian_chedan(self):
+        """
+        一键撤单按钮
+        """
+        return self.get_point({
+            "name": "btn_yijian_chedan",
+            "desc": "一键撤单",
+            "xpath": '//*[@content-desc="一键撤单"]'
+        })
+
+    def slider_baozhengjin_kaicang(self, offset=0, sleep=0.1):
+        """
+      开仓情况  保证金滑块
+           :param sleep 休眠
+           :param offset 价格偏移量 默认取50% x=368 每偏移69 向下多一个 偏移-69向上多一个 取值范围 [-2,2]
+        坐标: 0% 230  25% 299  50% 368  75% 437  100% 506
+        :return: 买入的按钮实例
+        """
+        # self.to_top_swipe()
+        # self.d.sleep(0.1)
+
+        # 基于买入按钮相对计算坐标
+        x, y, btn = self.btn_mairu_kaiduo()
+
+        x1 = x + offset * 69
+        y1 = y - 140
+        logging.info(f"开多坐标: ({x},{y})")
+        logging.info(f"保证金50%坐标: ({x1},{y1})")
+
+        self.click_point(x1, y1)
+        self.d.sleep(sleep)
+
+        return btn
+
+    def slider_baozhengjin_pingcang(self, offset=0, sleep=0.1):
+        """
+            平仓情况  保证金滑块
+           :param sleep 休眠
+           :param offset 价格偏移量 默认取50% x=368 每偏移69 向下多一个 偏移-69向上多一个 取值范围 [-2,2]
+        坐标: 0% 230  25% 299  50% 368  75% 437  100% 506
+        :return: 买入的按钮实例
+        """
+
+        # 基于买入按钮相对计算坐标
+        x, y, btn = self.btn_mairu_pingkong()
+        x1 = x + offset * 69
+        y1 = y - 70
+        logging.info(f"开多坐标: ({x},{y})")
+        logging.info(f"保证金50%坐标: ({x1},{y1})")
+
+        self.click_point(x1, y1)
+        self.d.sleep(sleep)
+
+        return btn
+
+    def click_kaicang(self):
+        """
+        开仓
+        """
+        self.click_xpath('//*[@content-desc="开仓"]')
+
+    def click_pingchang(self, sleep=0.1):
+        """
+        开仓
+        :param sleep: 等待时间
+        """
+        self.click_xpath('//*[@content-desc="平仓"]')
+        self.d.sleep(sleep)
+
+    def select_kaicang_weituo_xianjia(self):
+        """
+        开仓选择限价委托
+        """
+        x, y, _ = self.btn_kaichang()
+        logging.info(f"开仓按钮坐标: ({x},{y})")
+        x1 = x + 50
+        y1 = y + 55
+        logging.info(f"选择委托框: ({x1},{y1})")
+        self.click_point(x1, y1)
+        x2 = x1
+        y2 = y1 + 100
+        self.d.sleep(0.2)
+        logging.info(f"选择限价委托: ({x2},{y2})")
+        self.click_point(x2, y2)
+
+    def click_price_red(self, offset=0):
+        """
+        点击价格 开多 平空, 点击红色价格
+
+        :param offset 价格偏移量 默认取第5个, 每偏移20 向下多一个 偏移-20 向上多一个 取值范围 [-4,4]
+        """
+
+        x1 = 50
+        y1 = 330 + offset * 20
+        logging.info(f"红色部分选择价格: ({x1},{y1})")
+        self.click_point(x1, y1)
+
+    def click_price_green(self, offset=0):
+        """
+        点击价格 开空 平多, 点击红色价格
+        :param offset 价格偏移量 默认取第5个, 每偏移20 向下多一个,偏移-20 向上多一个
+        """
+
+        # self.select_kaicang_weituo_xianjia()
+        #
+        # self.d.sleep(0.1)
+
+        x1 = 50
+        y1 = 515 + offset
+        logging.info(f"绿色部分选择价格: ({x1},{y1})")
+        self.click_point(x1, y1)
+
+    def click_mairu_kaiduo(self):
+        """
+        买入开多
+        """
+        self.click_xpath('//*[@content-desc="买入/开多"]')
+        self.d.sleep(0.1)
+        # 弹出了确认框
+        if self.check_element_exists('//*[@content-desc="开仓确认"]'):
+            logging.info("弹出了确认框")
+            self.click_xpath('//*[@content-desc="确认"]')
+
+    def click_mairu_pingkong(self):
+        """
+        买入平空
+        """
+        self.click_xpath('//*[@content-desc="买入/平空"]')
+
+    def click_maichu_kaikong(self):
+        """
+        卖出开空
+        """
+        self.click_xpath('//*[@content-desc="卖出/开空"]')
+
+        self.d.sleep(0.1)
+        # 弹出了确认框
+        if self.check_element_exists('//*[@content-desc="开仓确认"]'):
+            logging.info("弹出了确认框")
+            self.click_xpath('//*[@content-desc="确认"]')
+
+    def click_maichu_pingduo(self):
+        """
+        卖出平多
+        """
+        self.click_xpath('//*[@content-desc="卖出/平多"]')
+
+    def click_yijian_chedan(self):
+        """
+        一键撤单
+        如果有滑动 ,回导致第一个坐标不准,点不上。 所以要提前滑动,确保第一个坐标点得上
+        """
+        self.click_xpath('//*[starts-with(@content-desc, "跟单(")]')
+        self.d.sleep(0.1)
+        self.click_xpath('//*[starts-with(@content-desc, "委托(")]')
+        self.d.sleep(0.1)
+
+        b = self.check_element_exists('//*[starts-with(@content-desc, "全部委托(")]')
+        logging.info("是否弹出了选择框: %s", b)
+
+        if b:
+            self.click_xpath('//*[starts-with(@content-desc, "全部委托(")]')
+            self.d.sleep(0.2)
+
+        self.click_xpath('//*[@content-desc="一键撤单"]')
+        self.d.sleep(0.1)
+
+        x, y, _ = self.get_point({
+            "name": "btn_yijian_chedan",
+            "desc": "撤销掉全部委托",
+            "xpath": '//*[@content-desc="撤销掉全部委托"]'
+        })
+        logging.info(f"撤销掉全部委托: ({x},{y})")
+        #  相对坐标 撤销掉全部委托 点击确定。
+        x1 = x + 80
+        y1 = y + 80
+        logging.info(f"撤销掉全 确定按钮: ({x1},{y1})")
+        self.click_point(x1, y1)
+
+    def text_xiadan_shuliang(self, text):
+        """
+        设置 下单数量
+        """
+        x, y, _ = self.get_point({
+            "name": "btn_baozhengjin",
+            "desc": "保证金",
+            "xpath": '//*[@content-desc="保证金"]'
+        })
+        logging.info(f"保证金坐标: ({x},{y})"'')
+        x1 = x - 130
+        y1 = y + 50
+        self.input_by_position(x1, y1, str(text), True)
+
+    def event_f1(self):
+        self.click_kaicang()
+        self.slider_baozhengjin_kaicang()
+        pass
+
+    def event_f2(self):
+        self.click_kaicang()
+        self.select_kaicang_weituo_xianjia()
+        self.d.sleep(0.1)
+
+        self.click_price_red()
+
+        self.text_xiadan_shuliang(3)
+
+        self.click_mairu_kaiduo()
+        pass
+
+    def event_f3(self):
+        self.to_top_swipe(sleep=0.2)
+        self.click_pingchang()
+        self.slider_baozhengjin_pingcang(offset=1)
+        pass
+
+    def event_f4(self):
+        self.to_top_swipe(sleep=0.2)
+        self.click_pingchang()
+        self.select_kaicang_weituo_xianjia()
+        self.click_price_green()
+        self.text_xiadan_shuliang(3)
+        self.click_maichu_pingduo()
+        pass
+
+    def event_f5(self):
+        self.to_top_swipe(sleep=0.2)
+        self.click_kaicang()
+        self.slider_baozhengjin_kaicang()
+        pass
+
+    def event_f6(self):
+        self.to_top_swipe(sleep=0.1)
+        self.click_kaicang()
+        self.select_kaicang_weituo_xianjia()
+        self.click_price_red()
+        self.click_maichu_kaikong()
+        pass
+
+    def event_f7(self):
+        self.to_top_swipe(sleep=0.1)
+        self.click_pingchang()
+        self.slider_baozhengjin_pingcang(offset=2)
+        pass
+
+    def event_f8(self):
+        self.to_top_swipe(sleep=0.2)
+
+        self.click_pingchang()
+
+        self.click_price_red()
+
+        self.text_xiadan_shuliang(3)
+
+        self.click_mairu_pingkong()
+        pass

+ 3 - 4
pyproject.toml

@@ -9,13 +9,10 @@ readme = "README.md"
 python = "~3.10"
 fastapi = "^0.115.8"
 uiautomator2 = "^3.2.8"
-weditor = "^0.7.3"
 uvicorn = "^0.34.0"
 numpy = "^2.2.4"
-opencv-python = "^4.11.0.86"
-wxpython = "^4.2.2"
 pyinstaller = "^6.12.0"
-
+opencv-python = "^4.11.0.86"
 
 [[tool.poetry.source]]
 name = "tsinghua"
@@ -23,9 +20,11 @@ url = "https://pypi.tuna.tsinghua.edu.cn/simple"
 priority = "explicit"
 
 
+
 [tool.poetry.group.dev.dependencies]
 pyinstaller = "^6.12.0"
 pytest = "^8.3.5"
+weditor = "^0.7.3"
 
 [build-system]
 requires = ["poetry-core"]

+ 867 - 0
test/deepcoin/a.XML

@@ -0,0 +1,867 @@
+<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
+<hierarchy rotation="0">
+    <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false"
+          enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][540,36]"
+          drawing-order="0" hint="" display-id="0">
+        <node index="0" text="" resource-id="com.android.systemui:id/status_bar_launch_animation_container"
+              class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false"
+              clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+              password="false" selected="false" visible-to-user="true" bounds="[0,0][540,36]" drawing-order="1" hint=""
+              display-id="0"/>
+        <node index="1" text="" resource-id="com.android.systemui:id/status_bar_container" class="android.widget.FrameLayout" package="com.android.systemui" content-desc=""
+              checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+              selected="false" visible-to-user="true" bounds="[0,0][540,36]" drawing-order="2" hint="" display-id="0">
+            <node index="0" text="" resource-id="com.android.systemui:id/status_bar" class="android.widget.FrameLayout" package="com.android.systemui" content-desc=""
+                  checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+                  selected="false" visible-to-user="true" bounds="[0,0][540,36]" drawing-order="1" hint="" display-id="0">
+                <node index="0" text="" resource-id="com.android.systemui:id/status_bar_contents" class="android.widget.LinearLayout" package="com.android.systemui" content-desc=""
+                      checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+                      password="false" selected="false" visible-to-user="true" bounds="[0,0][510,36]" drawing-order="2" hint="" display-id="0">
+                    <node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_container" class="android.widget.FrameLayout" package="com.android.systemui"
+                          content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                          long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[12,0][255,36]" drawing-order="1" hint="" display-id="0">
+                        <node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_content" class="android.widget.FrameLayout"
+                              package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
+                              scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[12,0][135,36]" drawing-order="1" hint=""
+                              display-id="0">
+                            <node index="0" text="" resource-id="com.android.systemui:id/status_bar_start_side_except_heads_up" class="android.widget.LinearLayout"
+                                  package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
+                                  focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[12,0][135,36]"
+                                  drawing-order="2" hint="" display-id="0">
+                                <node index="0" text="03:22" resource-id="com.android.systemui:id/clock"
+                                      class="android.widget.TextView" package="com.android.systemui" content-desc="03:22"
+                                      checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
+                                      focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                                      visible-to-user="true" bounds="[12,0][69,36]" drawing-order="2" hint="" display-id="0"/>
+                                <node index="1" text="" resource-id="com.android.systemui:id/notification_icon_area" class="android.widget.FrameLayout"
+                                      package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
+                                      focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[69,0][135,36]"
+                                      drawing-order="4" hint="" display-id="0">
+                                    <node index="0" text="" resource-id="com.android.systemui:id/notificationIcons" class="android.view.ViewGroup" package="com.android.systemui"
+                                          content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                                          long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[69,0][135,36]" drawing-order="1" hint=""
+                                          display-id="0">
+                                        <node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui"
+                                              content-desc="Android 系统通知:AndroidWifi 的连接受限" checkable="false" checked="false" clickable="false"
+                                              enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+                                              selected="false" visible-to-user="true" bounds="[69,0][102,36]" drawing-order="1" hint="" display-id="0"/>
+                                        <node index="1" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui"
+                                              content-desc="Android 系统通知:已安装证书授权服务" checkable="false" checked="false" clickable="false" enabled="true"
+                                              focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                              bounds="[102,0][135,36]" drawing-order="2" hint="" display-id="0"/>
+                                    </node>
+
+                                </node>
+
+                            </node>
+
+                        </node>
+
+                    </node>
+
+                    <node index="1" text="" resource-id="com.android.systemui:id/status_bar_end_side_container" class="android.widget.FrameLayout" package="com.android.systemui"
+                          content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                          long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[255,0][498,36]" drawing-order="3" hint="" display-id="0">
+                        <node index="0" text="" resource-id="com.android.systemui:id/status_bar_end_side_content" class="android.widget.LinearLayout" package="com.android.systemui"
+                              content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                              long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[427,0][498,36]" drawing-order="1" hint="" display-id="0">
+                            <node index="0" text="" resource-id="com.android.systemui:id/system_icons" class="android.widget.LinearLayout" package="com.android.systemui"
+                                  content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                                  long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[427,0][498,36]" drawing-order="2" hint="" display-id="0">
+
+                                <node index="0" text="" resource-id="com.android.systemui:id/statusIcons" class="android.widget.LinearLayout" package="com.android.systemui"
+                                      content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                                      long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[427,0][486,36]" drawing-order="1" hint=""
+                                      display-id="0">
+                                    <node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout" package="com.android.systemui"
+                                          content-desc="WLAN 信号满格。,未连接到互联网" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
+                                          focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                          bounds="[427,1][454,34]" drawing-order="13" hint="" display-id="0">
+                                        <node index="0" text="" resource-id="com.android.systemui:id/wifi_group" class="android.widget.LinearLayout" package="com.android.systemui"
+                                              content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
+                                              scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[431,1][454,34]"
+                                              drawing-order="1" hint="" display-id="0">
+                                            <node index="0" text="" resource-id="com.android.systemui:id/wifi_combo" class="android.widget.FrameLayout"
+                                                  package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
+                                                  focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                                                  visible-to-user="true" bounds="[431,6][454,29]" drawing-order="2" hint="" display-id="0">
+                                                <node index="0" text=""
+                                                      resource-id="com.android.systemui:id/wifi_signal"
+                                                      class="android.widget.ImageView"
+                                                      package="com.android.systemui"
+                                                      content-desc=""
+                                                      checkable="false"
+                                                      checked="false"
+                                                      clickable="false"
+                                                      enabled="true"
+                                                      focusable="false"
+                                                      focused="false"
+                                                      scrollable="false"
+                                                      long-clickable="false"
+                                                      password="false"
+                                                      selected="false"
+                                                      visible-to-user="true"
+                                                      bounds="[431,6][454,29]"
+                                                      drawing-order="1" hint=""
+                                                      display-id="0"/>
+                                            </node>
+
+                                        </node>
+
+                                    </node>
+
+                                    <node index="1" text="" resource-id="com.android.systemui:id/mobile_combo" class="android.widget.FrameLayout" package="com.android.systemui"
+                                          content-desc="手机信号满格。" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
+                                          scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[454,1][477,34]"
+                                          drawing-order="15" hint="" display-id="0">
+                                        <node index="0" text="" resource-id="com.android.systemui:id/mobile_group" class="android.widget.LinearLayout"
+                                              package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
+                                              focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                              bounds="[454,1][477,34]" drawing-order="1" hint="" display-id="0">
+                                            <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc=""
+                                                  checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                                                  long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[454,6][477,29]" drawing-order="4" hint=""
+                                                  display-id="0">
+                                                <node index="0" text="" resource-id="com.android.systemui:id/mobile_signal" class="android.widget.ImageView"
+                                                      package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false"
+                                                      enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+                                                      password="false" selected="false" visible-to-user="true" bounds="[454,6][477,29]" drawing-order="1"
+                                                      hint="" display-id="0"/>
+                                            </node>
+
+                                        </node>
+
+                                    </node>
+
+                                </node>
+
+                                <node index="1" text="" resource-id="com.android.systemui:id/battery" class="android.widget.LinearLayout" package="com.android.systemui"
+                                      content-desc="正在充电,已完成百分之 100。" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
+                                      scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[486,0][498,36]" drawing-order="2"
+                                      hint="" display-id="0">
+                                    <node index="0" text="" resource-id="" class="android.widget.ImageView" package="com.android.systemui"
+                                          content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
+                                          focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                                          visible-to-user="true" bounds="[486,7][498,27]" drawing-order="1" hint="" display-id="0"/>
+                                </node>
+
+                            </node>
+
+                        </node>
+
+                    </node>
+
+                </node>
+
+            </node>
+
+        </node>
+
+    </node>
+
+    <node index="0" text="" resource-id="com.android.systemui:id/navigation_bar_frame" class="android.widget.FrameLayout" package="com.android.systemui" content-desc=""
+          checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+          selected="false" visible-to-user="true" bounds="[0,888][540,960]" drawing-order="0" hint="" display-id="0">
+        <node index="0" text="" resource-id="com.android.systemui:id/navigation_bar_view" class="android.widget.FrameLayout" package="com.android.systemui" content-desc=""
+              checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+              selected="false" visible-to-user="true" bounds="[0,888][540,960]" drawing-order="1" hint="" display-id="0">
+            <node index="0" text="" resource-id="com.android.systemui:id/navigation_inflater" class="android.widget.FrameLayout" package="com.android.systemui" content-desc=""
+                  checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+                  selected="false" visible-to-user="true" bounds="[0,888][540,960]" drawing-order="1" hint="" display-id="0">
+                <node index="0" text="" resource-id="com.android.systemui:id/horizontal" class="android.widget.FrameLayout" package="com.android.systemui" content-desc=""
+                      checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+                      password="false" selected="false" visible-to-user="true" bounds="[0,888][540,960]" drawing-order="1" hint="" display-id="0">
+                    <node index="0" text="" resource-id="com.android.systemui:id/nav_buttons" class="android.widget.FrameLayout" package="com.android.systemui" content-desc=""
+                          checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+                          password="false" selected="false" visible-to-user="true" bounds="[0,888][540,960]" drawing-order="1" hint="" display-id="0">
+                        <node index="0" text="" resource-id="com.android.systemui:id/ends_group" class="android.widget.LinearLayout" package="com.android.systemui" content-desc=""
+                              checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+                              password="false" selected="false" visible-to-user="true" bounds="[0,888][540,960]" drawing-order="1" hint="" display-id="0">
+                            <node index="0"
+                                  text=""
+                                  resource-id=""
+                                  class="android.widget.RelativeLayout"
+                                  package="com.android.systemui"
+                                  content-desc=""
+                                  checkable="false"
+                                  checked="false"
+                                  clickable="false"
+                                  enabled="true"
+                                  focusable="false"
+                                  focused="false"
+                                  scrollable="false"
+                                  long-clickable="false"
+                                  password="false"
+                                  selected="false"
+                                  visible-to-user="true"
+                                  bounds="[0,888][67,960]"
+                                  drawing-order="1"
+                                  hint=""
+                                  display-id="0"/>
+
+                            <node index="1" text="" resource-id="" class="android.widget.RelativeLayout" package="com.android.systemui" content-desc="" checkable="false"
+                                  checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+                                  selected="false" visible-to-user="true" bounds="[67,888][202,960]" drawing-order="2" hint="" display-id="0">
+                                <node index="0" text=""
+                                      resource-id="com.android.systemui:id/back"
+                                      class="android.widget.ImageView"
+                                      package="com.android.systemui"
+                                      content-desc="返回"
+                                      checkable="false"
+                                      checked="false"
+                                      clickable="true"
+                                      enabled="true"
+                                      focusable="true"
+                                      focused="false"
+                                      scrollable="false"
+                                      long-clickable="false"
+                                      password="false"
+                                      selected="false"
+                                      visible-to-user="true"
+                                      bounds="[74,888][194,960]"
+                                      drawing-order="1" hint=""
+                                      display-id="0"/>
+                            </node>
+
+                            <node index="2" text="" resource-id="" class="android.widget.RelativeLayout" package="com.android.systemui" content-desc="" checkable="false"
+                                  checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+                                  selected="false" visible-to-user="true" bounds="[337,888][472,960]" drawing-order="4" hint="" display-id="0">
+                                <node index="0" text=""
+                                      resource-id="com.android.systemui:id/recent_apps"
+                                      class="android.widget.ImageView"
+                                      package="com.android.systemui"
+                                      content-desc="概览"
+                                      checkable="false"
+                                      checked="false"
+                                      clickable="true"
+                                      enabled="true"
+                                      focusable="true"
+                                      focused="false"
+                                      scrollable="false"
+                                      long-clickable="false"
+                                      password="false"
+                                      selected="false"
+                                      visible-to-user="true"
+                                      bounds="[344,888][464,960]"
+                                      drawing-order="1" hint=""
+                                      display-id="0"/>
+                            </node>
+                            <node index="3" text="" resource-id="" class="android.widget.RelativeLayout" package="com.android.systemui" content-desc="" checkable="false"
+                                  checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+                                  selected="false" visible-to-user="true" bounds="[472,888][540,960]" drawing-order="5" hint="" display-id="0"/>
+                        </node>
+
+                        <node index="1" text="" resource-id="com.android.systemui:id/center_group" class="android.widget.LinearLayout" package="com.android.systemui"
+                              content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                              long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[210,888][330,960]" drawing-order="2" hint="" display-id="0">
+                            <node index="0" text="" resource-id="com.android.systemui:id/home" class="android.widget.ImageView" package="com.android.systemui"
+                                  content-desc="主屏幕" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false"
+                                  long-clickable="true" password="false" selected="false" visible-to-user="true" bounds="[210,888][330,960]" drawing-order="1" hint=""
+                                  display-id="0"/>
+                        </node>
+
+                    </node>
+
+                </node>
+
+            </node>
+
+        </node>
+
+    </node>
+
+    <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.niocpeed.dna" content-desc="" checkable="false" checked="false" clickable="false"
+          enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+          bounds="[0,0][540,960]" drawing-order="0" hint="" display-id="0">
+        <node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="com.niocpeed.dna" content-desc="" checkable="false" checked="false" clickable="false"
+              enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+              bounds="[0,0][540,960]" drawing-order="1" hint="" display-id="0">
+            <node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                  clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                  visible-to-user="true" bounds="[0,0][540,960]" drawing-order="2" hint="" display-id="0">
+                <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                      clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                      visible-to-user="true" bounds="[0,0][540,960]" drawing-order="1" hint="" display-id="0">
+                    <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                          clickable="false" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="false" password="false" selected="false"
+                          visible-to-user="true" bounds="[0,0][540,960]" drawing-order="1" hint="" display-id="0">
+                        <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                              clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                              visible-to-user="true" bounds="[0,0][540,960]" drawing-order="0" hint="" display-id="0">
+                            <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                                  clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                                  visible-to-user="true" bounds="[0,0][540,960]" drawing-order="0" hint="" display-id="0">
+                                <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                                      clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                                      visible-to-user="true" bounds="[0,0][540,960]" drawing-order="0" hint="" display-id="0">
+                                    <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                                          clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+                                          selected="false" visible-to-user="true" bounds="[0,0][540,960]" drawing-order="0" hint="" display-id="0">
+                                        <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false"
+                                              checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+                                              password="false" selected="false" visible-to-user="true" bounds="[0,0][540,821]" drawing-order="0" hint="" display-id="0">
+                                            <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false"
+                                                  checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+                                                  password="false" selected="false" visible-to-user="true" bounds="[0,0][540,821]" drawing-order="0" hint="" display-id="0">
+                                                <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false"
+                                                      checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+                                                      password="false" selected="false" visible-to-user="true" bounds="[0,0][540,821]" drawing-order="0" hint="" display-id="0">
+                                                    <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false"
+                                                          checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                                                          long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,0][540,89]" drawing-order="0"
+                                                          hint="" display-id="0">
+                                                        <node index="0" text="" resource-id="" class="android.widget.ImageView"
+                                                              package="com.niocpeed.dna" content-desc="MOODENGUSDT 永续&#10;-1.46%" checkable="false"
+                                                              checked="false" clickable="true" enabled="true" focusable="true" focused="false"
+                                                              scrollable="false" long-clickable="true" password="false" selected="false"
+                                                              visible-to-user="true" bounds="[24,43][444,82]" drawing-order="0" hint=""
+                                                              display-id="0"/>
+                                                        <node NAF="true" index="1" text="" resource-id=""
+                                                              class="android.widget.ImageView" package="com.niocpeed.dna"
+                                                              content-desc="" checkable="false" checked="false"
+                                                              clickable="true" enabled="true" focusable="true"
+                                                              focused="false" scrollable="false" long-clickable="false"
+                                                              password="false" selected="false" visible-to-user="true"
+                                                              bounds="[468,36][540,89]" drawing-order="0" hint=""
+                                                              display-id="0"/>
+                                                    </node>
+
+                                                    <node index="1" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false"
+                                                          checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false"
+                                                          long-clickable="false" password="false" selected="false" visible-to-user="true" bounds="[0,89][540,821]" drawing-order="0"
+                                                          hint="" display-id="0">
+                                                        <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc=""
+                                                              checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
+                                                              scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                              bounds="[0,89][540,821]" drawing-order="0" hint="" display-id="0">
+                                                            <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc=""
+                                                                  checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
+                                                                  scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                  bounds="[0,89][540,821]" drawing-order="0" hint="" display-id="0">
+                                                                <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc=""
+                                                                      checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false"
+                                                                      scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                      bounds="[0,89][540,774]" drawing-order="0" hint="" display-id="0">
+                                                                    <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc=""
+                                                                          checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
+                                                                          scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                          bounds="[0,89][540,774]" drawing-order="0" hint="" display-id="0">
+                                                                        <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc=""
+                                                                              checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
+                                                                              scrollable="false" long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                              bounds="[0,89][540,774]" drawing-order="0" hint="" display-id="0">
+                                                                            <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                  content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
+                                                                                  focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+                                                                                  selected="false" visible-to-user="true" bounds="[0,89][540,774]" drawing-order="0" hint=""
+                                                                                  display-id="0">
+                                                                                <node index="0" text="" resource-id="" class="android.widget.ScrollView" package="com.niocpeed.dna"
+                                                                                      content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
+                                                                                      focusable="false" focused="false" scrollable="true" long-clickable="false" password="false"
+                                                                                      selected="false" visible-to-user="true" bounds="[0,89][540,774]" drawing-order="0" hint=""
+                                                                                      display-id="0">
+                                                                                    <node index="0" text="" resource-id="" class="android.view.View"
+                                                                                          package="com.niocpeed.dna" content-desc="0.03961&#10;85.34K"
+                                                                                          checkable="false" checked="false" clickable="true" enabled="true"
+                                                                                          focusable="true" focused="false" scrollable="false"
+                                                                                          long-clickable="false" password="false" selected="false"
+                                                                                          visible-to-user="true" bounds="[11,89][208,99]" drawing-order="0"
+                                                                                          hint="" display-id="0"/>
+                                                                                    <node index="1" text="" resource-id=""
+                                                                                          class="android.view.View"
+                                                                                          package="com.niocpeed.dna"
+                                                                                          content-desc="0.03960&#10;42.24K"
+                                                                                          checkable="false" checked="false"
+                                                                                          clickable="true" enabled="true"
+                                                                                          focusable="true" focused="false"
+                                                                                          scrollable="false"
+                                                                                          long-clickable="false"
+                                                                                          password="false" selected="false"
+                                                                                          visible-to-user="true"
+                                                                                          bounds="[11,99][208,125]"
+                                                                                          drawing-order="0" hint=""
+                                                                                          display-id="0"/>
+                                                                                    <node index="2"
+                                                                                          text=""
+                                                                                          resource-id=""
+                                                                                          class="android.view.View"
+                                                                                          package="com.niocpeed.dna"
+                                                                                          content-desc="0.03959&#10;28.32K"
+                                                                                          checkable="false"
+                                                                                          checked="false"
+                                                                                          clickable="true"
+                                                                                          enabled="true"
+                                                                                          focusable="true"
+                                                                                          focused="false"
+                                                                                          scrollable="false"
+                                                                                          long-clickable="false"
+                                                                                          password="false"
+                                                                                          selected="false"
+                                                                                          visible-to-user="true"
+                                                                                          bounds="[11,125][208,150]"
+                                                                                          drawing-order="0"
+                                                                                          hint=""
+                                                                                          display-id="0"/>
+                                                                                    <node index="3" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                          content-desc="0.03958&#10;97.22K" checkable="false" checked="false" clickable="true"
+                                                                                          enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                          long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                                          bounds="[11,150][208,176]" drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node
+                                                                                            index="4" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                            content-desc="0.03957&#10;103.37K" checkable="false" checked="false" clickable="true"
+                                                                                            enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                            long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                                            bounds="[11,176][208,201]" drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node index="5"
+                                                                                          text=""
+                                                                                          resource-id=""
+                                                                                          class="android.view.View"
+                                                                                          package="com.niocpeed.dna"
+                                                                                          content-desc="资金费率&#10;-0.045842%"
+                                                                                          checkable="false"
+                                                                                          checked="false"
+                                                                                          clickable="true"
+                                                                                          enabled="true"
+                                                                                          focusable="true"
+                                                                                          focused="false"
+                                                                                          scrollable="false"
+                                                                                          long-clickable="true"
+                                                                                          password="false"
+                                                                                          selected="false"
+                                                                                          visible-to-user="true"
+                                                                                          bounds="[23,213][196,233]"
+                                                                                          drawing-order="0"
+                                                                                          hint=""
+                                                                                          display-id="0"/>
+                                                                                    <node index="6" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                          content-desc="距结算" checkable="false" checked="false" clickable="false"
+                                                                                          enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                          long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                                          bounds="[23,233][62,252]" drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node
+                                                                                            index="7" text="" resource-id="" class="android.widget.ImageView"
+                                                                                            package="com.niocpeed.dna" content-desc="0.00001" checkable="false" checked="false"
+                                                                                            clickable="true" enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                            long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                                            bounds="[21,258][105,290]" drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node index="8"
+                                                                                          text=""
+                                                                                          resource-id=""
+                                                                                          class="android.view.View"
+                                                                                          package="com.niocpeed.dna"
+                                                                                          content-desc="00:37:41"
+                                                                                          checkable="false"
+                                                                                          checked="false"
+                                                                                          clickable="false"
+                                                                                          enabled="true"
+                                                                                          focusable="true"
+                                                                                          focused="false"
+                                                                                          scrollable="false"
+                                                                                          long-clickable="false"
+                                                                                          password="false"
+                                                                                          selected="false"
+                                                                                          visible-to-user="true"
+                                                                                          bounds="[144,233][196,252]"
+                                                                                          drawing-order="0"
+                                                                                          hint=""
+                                                                                          display-id="0"/>
+                                                                                    <node index="9" text="" resource-id="" class="android.widget.ImageView"
+                                                                                          package="com.niocpeed.dna" content-desc="默认" checkable="false" checked="false"
+                                                                                          clickable="true" enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                          long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                                          bounds="[113,258][197,290]" drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node
+                                                                                            index="10" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                            content-desc="可开" checkable="false" checked="false" clickable="true" enabled="true"
+                                                                                            focusable="true" focused="false" scrollable="false" long-clickable="true"
+                                                                                            password="false" selected="false" visible-to-user="true" bounds="[218,89][249,110]"
+                                                                                            drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node index="11" text="" resource-id=""
+                                                                                          class="android.view.View"
+                                                                                          package="com.niocpeed.dna"
+                                                                                          content-desc="814.56 USDT"
+                                                                                          checkable="false" checked="false"
+                                                                                          clickable="false" enabled="true"
+                                                                                          focusable="true" focused="false"
+                                                                                          scrollable="false"
+                                                                                          long-clickable="false"
+                                                                                          password="false" selected="false"
+                                                                                          visible-to-user="true"
+                                                                                          bounds="[425,89][519,110]"
+                                                                                          drawing-order="0" hint=""
+                                                                                          display-id="0"/>
+                                                                                    <node index="12"
+                                                                                          text=""
+                                                                                          resource-id=""
+                                                                                          class="android.view.View"
+                                                                                          package="com.niocpeed.dna"
+                                                                                          content-desc="预估强平价"
+                                                                                          checkable="false"
+                                                                                          checked="false"
+                                                                                          clickable="true"
+                                                                                          enabled="true"
+                                                                                          focusable="true"
+                                                                                          focused="false"
+                                                                                          scrollable="false"
+                                                                                          long-clickable="true"
+                                                                                          password="false"
+                                                                                          selected="false"
+                                                                                          visible-to-user="true"
+                                                                                          bounds="[218,110][296,134]"
+                                                                                          drawing-order="0"
+                                                                                          hint=""
+                                                                                          display-id="0"/>
+                                                                                    <node index="13" text="" resource-id="" class="android.widget.Button"
+                                                                                          package="com.niocpeed.dna" content-desc="买入/开多" checkable="false" checked="false"
+                                                                                          clickable="true" enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                          long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                                          bounds="[218,138][519,185]" drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node
+                                                                                            index="14" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                            content-desc="可开" checkable="false" checked="false" clickable="true" enabled="true"
+                                                                                            focusable="true" focused="false" scrollable="false" long-clickable="true"
+                                                                                            password="false" selected="false" visible-to-user="true" bounds="[218,192][249,216]"
+                                                                                            drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node index="15" text="" resource-id=""
+                                                                                          class="android.view.View"
+                                                                                          package="com.niocpeed.dna"
+                                                                                          content-desc="814.55 USDT"
+                                                                                          checkable="false" checked="false"
+                                                                                          clickable="false" enabled="true"
+                                                                                          focusable="true" focused="false"
+                                                                                          scrollable="false"
+                                                                                          long-clickable="false"
+                                                                                          password="false" selected="false"
+                                                                                          visible-to-user="true"
+                                                                                          bounds="[425,192][519,216]"
+                                                                                          drawing-order="0" hint=""
+                                                                                          display-id="0"/>
+                                                                                    <node index="16"
+                                                                                          text=""
+                                                                                          resource-id=""
+                                                                                          class="android.view.View"
+                                                                                          package="com.niocpeed.dna"
+                                                                                          content-desc="预估强平价"
+                                                                                          checkable="false"
+                                                                                          checked="false"
+                                                                                          clickable="true"
+                                                                                          enabled="true"
+                                                                                          focusable="true"
+                                                                                          focused="false"
+                                                                                          scrollable="false"
+                                                                                          long-clickable="true"
+                                                                                          password="false"
+                                                                                          selected="false"
+                                                                                          visible-to-user="true"
+                                                                                          bounds="[218,216][296,240]"
+                                                                                          drawing-order="0"
+                                                                                          hint=""
+                                                                                          display-id="0"/>
+                                                                                    <node index="17" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                          content-desc="0.03848" checkable="false" checked="false" clickable="false"
+                                                                                          enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                          long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                                          bounds="[461,110][519,134]" drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node
+                                                                                            index="18" text="" resource-id="" class="android.widget.Button"
+                                                                                            package="com.niocpeed.dna" content-desc="卖出/开空" checkable="false" checked="false"
+                                                                                            clickable="true" enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                            long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                                            bounds="[218,245][519,291]" drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node
+                                                                                            index="19" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                            content-desc="0.04080" checkable="false" checked="false" clickable="false"
+                                                                                            enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                            long-clickable="false" password="false" selected="false" visible-to-user="true"
+                                                                                            bounds="[461,216][519,240]" drawing-order="0" hint="" display-id="0"/>
+                                                                                    <node index="20" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                          content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
+                                                                                          focusable="false" focused="false" scrollable="false" long-clickable="false"
+                                                                                          password="false" selected="false" visible-to-user="true" bounds="[0,407][540,774]"
+                                                                                          drawing-order="0" hint="" display-id="0">
+                                                                                        <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                              content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
+                                                                                              focusable="false" focused="false" scrollable="true" long-clickable="false"
+                                                                                              password="false" selected="false" visible-to-user="true" bounds="[0,407][540,774]"
+                                                                                              drawing-order="0" hint="" display-id="0">
+                                                                                            <node index="0" text="" resource-id="" class="android.view.View"
+                                                                                                  package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                                                                                                  clickable="false" enabled="true" focusable="false" focused="false"
+                                                                                                  scrollable="false" long-clickable="false" password="false" selected="false"
+                                                                                                  visible-to-user="true" bounds="[0,407][540,774]" drawing-order="0" hint=""
+                                                                                                  display-id="0">
+                                                                                                <node index="0" text="" resource-id="" class="android.view.View"
+                                                                                                      package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                                                                                                      clickable="false" enabled="true" focusable="false" focused="false"
+                                                                                                      scrollable="false" long-clickable="false" password="false" selected="false"
+                                                                                                      visible-to-user="true" bounds="[0,407][540,774]" drawing-order="0" hint=""
+                                                                                                      display-id="0">
+                                                                                                    <node index="0" text="" resource-id="" class="android.view.View"
+                                                                                                          package="com.niocpeed.dna" content-desc="" checkable="false"
+                                                                                                          checked="false" clickable="false" enabled="true" focusable="false"
+                                                                                                          focused="false" scrollable="false" long-clickable="false" password="false"
+                                                                                                          selected="false" visible-to-user="true" bounds="[0,407][540,774]"
+                                                                                                          drawing-order="0" hint="" display-id="0">
+                                                                                                        <node index="0" text="" resource-id="" class="android.widget.ImageView"
+                                                                                                              package="com.niocpeed.dna" content-desc="数据为空" checkable="false"
+                                                                                                              checked="false" clickable="false" enabled="true" focusable="true"
+                                                                                                              focused="false" scrollable="false" long-clickable="false"
+                                                                                                              password="false" selected="false" visible-to-user="true"
+                                                                                                              bounds="[0,407][540,620]" drawing-order="0" hint="" display-id="0">
+                                                                                                            <node index="0" text="" resource-id="" class="android.view.View"
+                                                                                                                  package="com.niocpeed.dna" content-desc="交易指南"
+                                                                                                                  checkable="false" checked="false" clickable="true"
+                                                                                                                  enabled="true" focusable="true" focused="false"
+                                                                                                                  scrollable="false" long-clickable="true" password="false"
+                                                                                                                  selected="false" visible-to-user="true"
+                                                                                                                  bounds="[165,585][244,620]" drawing-order="0" hint=""
+                                                                                                                  display-id="0"/>
+                                                                                                            <node index="1" text="" resource-id=""
+                                                                                                                  class="android.view.View"
+                                                                                                                  package="com.niocpeed.dna"
+                                                                                                                  content-desc="跟单交易"
+                                                                                                                  checkable="false" checked="false"
+                                                                                                                  clickable="true" enabled="true"
+                                                                                                                  focusable="true" focused="false"
+                                                                                                                  scrollable="false"
+                                                                                                                  long-clickable="true"
+                                                                                                                  password="false" selected="false"
+                                                                                                                  visible-to-user="true"
+                                                                                                                  bounds="[296,585][375,620]"
+                                                                                                                  drawing-order="0" hint=""
+                                                                                                                  display-id="0"/>
+                                                                                                        </node>
+
+                                                                                                    </node>
+
+                                                                                                </node>
+
+                                                                                            </node>
+
+                                                                                        </node>
+
+                                                                                    </node>
+
+                                                                                </node>
+
+                                                                                <node index="1" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                      content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
+                                                                                      focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
+                                                                                      selected="false" visible-to-user="true" bounds="[21,326][488,359]" drawing-order="0" hint=""
+                                                                                      display-id="0">
+                                                                                    <node index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                                          content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
+                                                                                          focusable="false" focused="false" scrollable="false" long-clickable="false"
+                                                                                          password="false" selected="false" visible-to-user="true" bounds="[21,326][488,359]"
+                                                                                          drawing-order="0" hint="" display-id="0">
+                                                                                        <node index="0" text="" resource-id=""
+                                                                                              class="android.widget.ImageView"
+                                                                                              package="com.niocpeed.dna"
+                                                                                              content-desc="持仓(0)"
+                                                                                              checkable="false" checked="false"
+                                                                                              clickable="true" enabled="true"
+                                                                                              focusable="true" focused="false"
+                                                                                              scrollable="false"
+                                                                                              long-clickable="false" password="false"
+                                                                                              selected="false" visible-to-user="true"
+                                                                                              bounds="[21,326][120,359]"
+                                                                                              drawing-order="0" hint=""
+                                                                                              display-id="0"/>
+                                                                                        <node index="1"
+                                                                                              text=""
+                                                                                              resource-id=""
+                                                                                              class="android.widget.ImageView"
+                                                                                              package="com.niocpeed.dna"
+                                                                                              content-desc="委托(0)"
+                                                                                              checkable="false"
+                                                                                              checked="false"
+                                                                                              clickable="true"
+                                                                                              enabled="true"
+                                                                                              focusable="true"
+                                                                                              focused="false"
+                                                                                              scrollable="false"
+                                                                                              long-clickable="false"
+                                                                                              password="false"
+                                                                                              selected="false"
+                                                                                              visible-to-user="true"
+                                                                                              bounds="[120,326][221,359]"
+                                                                                              drawing-order="0"
+                                                                                              hint=""
+                                                                                              display-id="0"/>
+                                                                                        <node index="2" text="" resource-id="" class="android.view.View"
+                                                                                              package="com.niocpeed.dna" content-desc="跟单(0)" checkable="false"
+                                                                                              checked="false" clickable="true" enabled="true" focusable="true" focused="false"
+                                                                                              scrollable="false" long-clickable="false" password="false" selected="false"
+                                                                                              visible-to-user="true" bounds="[221,326][310,359]" drawing-order="0" hint=""
+                                                                                              display-id="0"/>
+                                                                                        <node index="3" text="" resource-id=""
+                                                                                              class="android.view.View" package="com.niocpeed.dna"
+                                                                                              content-desc="策略(0)" checkable="false" checked="false"
+                                                                                              clickable="true" enabled="true" focusable="true"
+                                                                                              focused="false" scrollable="false"
+                                                                                              long-clickable="false" password="false" selected="false"
+                                                                                              visible-to-user="true" bounds="[310,326][378,359]"
+                                                                                              drawing-order="0" hint="" display-id="0"/>
+                                                                                    </node>
+
+                                                                                </node>
+                                                                                <node index="2" text="" resource-id="" class="android.widget.ImageView"
+                                                                                      package="com.niocpeed.dna" content-desc="币种" checkable="false" checked="false"
+                                                                                      clickable="true" enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                      long-clickable="true" password="false" selected="false" visible-to-user="true"
+                                                                                      bounds="[115,359][162,405]" drawing-order="0" hint="" display-id="0"/>
+                                                                                <node NAF="true"
+                                                                                      index="3"
+                                                                                      text=""
+                                                                                      resource-id=""
+                                                                                      class="android.view.View"
+                                                                                      package="com.niocpeed.dna"
+                                                                                      content-desc=""
+                                                                                      checkable="false"
+                                                                                      checked="false"
+                                                                                      clickable="true"
+                                                                                      enabled="true"
+                                                                                      focusable="true"
+                                                                                      focused="false"
+                                                                                      scrollable="false"
+                                                                                      long-clickable="true"
+                                                                                      password="false"
+                                                                                      selected="false"
+                                                                                      visible-to-user="true"
+                                                                                      bounds="[44,362][110,401]"
+                                                                                      drawing-order="0"
+                                                                                      hint=""
+                                                                                      display-id="0"/>
+                                                                                <node NAF="true" index="4" text="" resource-id="" class="android.widget.ImageView"
+                                                                                      package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                                                                                      clickable="true" enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                      long-clickable="true" password="false" selected="false" visible-to-user="true"
+                                                                                      bounds="[21,373][39,391]" drawing-order="0" hint="" display-id="0"/>
+                                                                                <node index="5"
+                                                                                      text=""
+                                                                                      resource-id=""
+                                                                                      class="android.view.View"
+                                                                                      package="com.niocpeed.dna"
+                                                                                      content-desc="只看当前:"
+                                                                                      checkable="false"
+                                                                                      checked="false"
+                                                                                      clickable="false"
+                                                                                      enabled="true"
+                                                                                      focusable="true"
+                                                                                      focused="false"
+                                                                                      scrollable="false"
+                                                                                      long-clickable="false"
+                                                                                      password="false"
+                                                                                      selected="false"
+                                                                                      visible-to-user="true"
+                                                                                      bounds="[44,374][110,390]"
+                                                                                      drawing-order="0"
+                                                                                      hint=""
+                                                                                      display-id="0"/>
+                                                                                <node NAF="true" index="6" text="" resource-id="" class="android.widget.ImageView"
+                                                                                      package="com.niocpeed.dna" content-desc="" checkable="false" checked="false"
+                                                                                      clickable="true" enabled="true" focusable="true" focused="false" scrollable="false"
+                                                                                      long-clickable="true" password="false" selected="false" visible-to-user="true"
+                                                                                      bounds="[488,316][540,343]" drawing-order="0" hint="" display-id="0"/>
+                                                                                <node index="7"
+                                                                                      text=""
+                                                                                      resource-id=""
+                                                                                      class="android.view.View"
+                                                                                      package="com.niocpeed.dna"
+                                                                                      content-desc="一键撤单"
+                                                                                      checkable="false"
+                                                                                      checked="false"
+                                                                                      clickable="true"
+                                                                                      enabled="true"
+                                                                                      focusable="true"
+                                                                                      focused="false"
+                                                                                      scrollable="false"
+                                                                                      long-clickable="true"
+                                                                                      password="false"
+                                                                                      selected="false"
+                                                                                      visible-to-user="true"
+                                                                                      bounds="[449,365][540,399]"
+                                                                                      drawing-order="0"
+                                                                                      hint=""
+                                                                                      display-id="0"/>
+
+                                                                            </node>
+
+                                                                        </node>
+
+                                                                    </node>
+
+                                                                </node>
+                                                                <node NAF="true" index="1" text="" resource-id="" class="android.widget.ImageView" package="com.niocpeed.dna"
+                                                                      content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
+                                                                      focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                                                                      visible-to-user="true" bounds="[410,677][506,749]" drawing-order="0" hint="" display-id="0"/>
+                                                                <node
+                                                                        index="2" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                                        content-desc="MOODENGUSDT 永续 图表" checkable="false" checked="false" clickable="true" enabled="true"
+                                                                        focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false"
+                                                                        visible-to-user="true" bounds="[0,776][482,821]" drawing-order="0" hint="" display-id="0"/>
+                                                                <node
+                                                                        NAF="true" index="3" text="" resource-id="" class="android.widget.ImageView" package="com.niocpeed.dna"
+                                                                        content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true"
+                                                                        focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
+                                                                        visible-to-user="true" bounds="[482,780][530,816]" drawing-order="0" hint="" display-id="0"/>
+                                                            </node>
+
+                                                        </node>
+
+                                                    </node>
+
+                                                </node>
+
+                                            </node>
+
+                                        </node>
+
+                                        <node index="1" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="" checkable="false"
+                                              checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
+                                              password="false" selected="false" visible-to-user="true" bounds="[0,821][540,960]" drawing-order="0" hint="" display-id="0">
+                                            <node
+                                                    index="0" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="首页" checkable="false"
+                                                    checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true"
+                                                    password="false" selected="false" visible-to-user="true" bounds="[0,821][108,888]" drawing-order="0" hint="" display-id="0"/>
+                                            <node index="1" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="行情" checkable="false"
+                                                  checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true"
+                                                  password="false" selected="false" visible-to-user="true" bounds="[108,821][216,888]" drawing-order="0" hint="" display-id="0"/>
+                                            <node index="2" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna" content-desc="交易" checkable="false"
+                                                  checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true"
+                                                  password="false" selected="false" visible-to-user="true" bounds="[216,821][324,888]" drawing-order="0" hint=""
+                                                  display-id="0"/>
+                                            <node index="3" text="" resource-id="" class="android.view.View" package="com.niocpeed.dna"
+                                                  content-desc="跟单" checkable="false" checked="false" clickable="true" enabled="true"
+                                                  focusable="true" focused="false" scrollable="false" long-clickable="true" password="false"
+                                                  selected="false" visible-to-user="true" bounds="[324,821][432,888]" drawing-order="0" hint=""
+                                                  display-id="0"/>
+                                            <node index="4" text="" resource-id="" class="android.view.View"
+                                                  package="com.niocpeed.dna" content-desc="资产" checkable="false"
+                                                  checked="false" clickable="true" enabled="true" focusable="true"
+                                                  focused="false" scrollable="false" long-clickable="true" password="false"
+                                                  selected="false" visible-to-user="true" bounds="[432,821][540,888]"
+                                                  drawing-order="0" hint="" display-id="0"/>
+                                        </node>
+
+                                    </node>
+
+                                </node>
+
+                            </node>
+
+                        </node>
+
+                    </node>
+
+                </node>
+
+            </node>
+
+        </node>
+
+    </node>
+
+</hierarchy>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
test/deepcoin/a.json


+ 0 - 33
test/deepcoin/test.py

@@ -1,33 +0,0 @@
-#使用python构建一个UI页面 上面有3个按钮
-#点击按钮1,弹出toast提示“点击了按钮1”
-#点击按钮2,弹出toast提示“点击了按钮2”
-#点击按钮3,弹出toast提示“点击了按钮3”
-import tkinter as tk
-from tkinter import messagebox
-
-
-class ToastApp:
-    def __init__(self):
-        self.root = tk.Tk()
-        self.root.title("Button Demo")
-        self.root.geometry("300x200")
-
-        # Create and pack buttons
-        for i in range(3):
-            btn = tk.Button(
-                self.root,
-                text=f"Button {i + 1}",
-                command=lambda x=i + 1: self.show_toast(x)
-            )
-            btn.pack(pady=10)
-
-    def show_toast(self, button_num):
-        messagebox.showinfo("Toast", f"Clicked Button {button_num}")
-
-    def run(self):
-        self.root.mainloop()
-
-
-if __name__ == "__main__":
-    app = ToastApp()
-    app.run()

+ 146 - 0
test/deepcoin/test03.py

@@ -0,0 +1,146 @@
+import wx
+import os
+
+
+class MainFrame(wx.Frame):
+    def __init__(self, parent, title):
+        super().__init__(parent, title=title, size=(800, 600))
+
+        # 创建菜单栏
+        menubar = wx.MenuBar()
+        menu1 = wx.Menu()
+        menu1.Append(wx.ID_EXIT, "退出")
+        menubar.Append(menu1, "菜单1")
+
+        menu2 = wx.Menu()
+        menu2.Append(wx.ID_ANY, "选项1")
+        menu2.Append(wx.ID_ANY, "选项2")
+        menubar.Append(menu2, "菜单2")
+
+        menu3 = wx.Menu()
+        menu3.Append(wx.ID_ANY, "设置")
+        menubar.Append(menu3, "菜单3")
+
+        menu4 = wx.Menu()
+        menu4.Append(wx.ID_ANY, "关于")
+        menubar.Append(menu4, "菜单4")
+
+        self.SetMenuBar(menubar)
+
+        # 创建主面板和布局
+        main_panel = wx.Panel(self)
+        main_sizer = wx.BoxSizer(wx.HORIZONTAL)
+
+        # 创建左侧导航栏
+        left_panel = wx.Panel(main_panel)
+        left_sizer = wx.BoxSizer(wx.VERTICAL)
+
+        self.navigation_list = wx.ListBox(left_panel, choices=["tab1", "tab2", "tab3", "tab4", "..."], style=wx.LB_SINGLE)
+        left_sizer.Add(self.navigation_list, 1, wx.EXPAND | wx.ALL, 5)
+
+        left_panel.SetSizer(left_sizer)
+        main_sizer.Add(left_panel, 0, wx.EXPAND | wx.ALL, 5)
+
+        # 创建右侧内容区域
+        right_panel = wx.Panel(main_panel)
+        right_sizer = wx.BoxSizer(wx.HORIZONTAL)
+
+        # 创建 tab 对应的右侧内容面板
+        self.tab_panels = {}
+        for tab_name in ["tab1", "tab2", "tab3", "tab4", "..."]:
+            tab_panel = wx.Panel(right_panel)
+            tab_sizer = wx.BoxSizer(wx.VERTICAL)
+
+            # 将 main_content 创建的内容添加到 tab 面板中
+            content = self.main_content(tab_panel, tab_name)
+            tab_sizer.Add(content, 1, wx.EXPAND | wx.ALL, 5)
+
+            tab_panel.SetSizer(tab_sizer)
+            self.tab_panels[tab_name] = tab_panel
+            right_sizer.Add(tab_panel, 1, wx.EXPAND | wx.ALL, 5)
+            tab_panel.Hide()  # 初始隐藏所有面板
+
+        right_panel.SetSizer(right_sizer)
+        main_sizer.Add(right_panel, 1, wx.EXPAND | wx.ALL, 5)
+
+        main_panel.SetSizer(main_sizer)
+
+        # 绑定 ListBox 的选择事件
+        self.navigation_list.Bind(wx.EVT_LISTBOX, self.on_tab_selected)
+
+        self.Show(True)
+        self.show_tab_content("tab1")  # 初始显示 tab1 的内容
+
+    def main_content(self, parent, tab_name):
+        # 创建右侧内容区域
+        right_panel = wx.Panel(parent)
+        right_sizer = wx.BoxSizer(wx.HORIZONTAL)
+
+        if tab_name == "tab1":
+            # tab1 的内容
+            left_content_panel = wx.Panel(right_panel)
+            left_content_sizer = wx.BoxSizer(wx.VERTICAL)
+
+            form_panel = wx.Panel(left_content_panel)
+            form_sizer = wx.GridBagSizer(5, 5)
+
+            form_sizer.Add(wx.StaticText(form_panel, label="设置1:"), pos=(0, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
+            form_sizer.Add(wx.TextCtrl(form_panel), pos=(0, 1), flag=wx.EXPAND)
+
+            form_sizer.Add(wx.StaticText(form_panel, label="设置2:"), pos=(1, 0), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
+            form_sizer.Add(wx.TextCtrl(form_panel), pos=(1, 1), flag=wx.EXPAND)
+
+            form_panel.SetSizer(form_sizer)
+            left_content_sizer.Add(form_panel, 0, wx.EXPAND | wx.ALL, 5)
+
+            self.log_text = wx.TextCtrl(left_content_panel, style=wx.TE_MULTILINE | wx.TE_READONLY)
+            left_content_sizer.Add(self.log_text, 1, wx.EXPAND | wx.ALL, 5)
+
+            left_content_panel.SetSizer(left_content_sizer)
+            right_sizer.Add(left_content_panel, 1, wx.EXPAND | wx.ALL, 5)
+
+            image_panel = wx.Panel(right_panel)
+            image_sizer = wx.BoxSizer(wx.HORIZONTAL)
+
+            current_dir = os.path.dirname(os.path.abspath(__file__))
+            image_path = os.path.join(current_dir, "../../assets/img.png")
+            img = wx.Image(image_path, wx.BITMAP_TYPE_PNG).Scale(200, 200)
+            self.image_bitmap = wx.StaticBitmap(image_panel, wx.ID_ANY, wx.Bitmap(img))
+            image_sizer.Add(self.image_bitmap, 1, wx.CENTER)
+
+            image_panel.SetSizer(image_sizer)
+            right_sizer.Add(image_panel, 0, wx.CENTER | wx.ALL, 5)
+        elif tab_name == "tab2":
+            # tab2 的内容
+            text = wx.StaticText(right_panel, label="这是 tab2 的特殊内容")
+            right_sizer.Add(text, 1, wx.CENTER)
+        elif tab_name == "tab3":
+            # tab3 的内容
+            button = wx.Button(right_panel, label="点击我")
+            right_sizer.Add(button, 1, wx.CENTER)
+        else:
+            # 其他 tab 的内容
+            text = wx.StaticText(right_panel, label=f"这是 {tab_name} 的默认内容")
+            right_sizer.Add(text, 1, wx.CENTER)
+
+        right_panel.SetSizer(right_sizer)
+
+        return right_panel
+
+    def on_tab_selected(self, event):
+        selected_tab = self.navigation_list.GetStringSelection()
+        self.show_tab_content(selected_tab)
+
+    def show_tab_content(self, tab_name):
+        for name, panel in self.tab_panels.items():
+            if name == tab_name:
+                panel.Show()
+            else:
+                panel.Hide()
+        self.Layout()  # 重新布局
+
+
+if __name__ == '__main__':
+    app = wx.App()
+    frame = MainFrame(None, "我的GUI布局")
+    app.MainLoop()

+ 99 - 0
test/deepcoin/test04.py

@@ -0,0 +1,99 @@
+import tkinter as tk
+from tkinter import Menu, Text, Label, Entry, Button
+
+from PIL import Image, ImageTk  # 需要安装 Pillow 库
+
+
+class Application(tk.Tk):
+    def __init__(self):
+        super().__init__()
+        self.content_frame = None
+        self.navigation_buttons = None
+        self.navigation_frame = None
+        self.title("Tkinter 复杂 UI 示例")
+        self.geometry("800x600")
+
+        self.create_menu()
+        self.create_navigation()
+        self.create_content_area()
+
+        self.content_cache = {}  # 缓存内容
+
+    def create_menu(self):
+        menubar = Menu(self)
+        self.config(menu=menubar)
+
+        menu1 = Menu(menubar, tearoff=0)
+        menu1.add_command(label="选项 1")
+        menu1.add_command(label="选项 2")
+        menubar.add_cascade(label="菜单 1", menu=menu1)
+        menu1 = Menu(menubar, tearoff=0)
+        menu1.add_command(label="选项 1")
+        menu1.add_command(label="选项 2")
+        menubar.add_cascade(label="菜单 2", menu=menu1)
+        # 添加其他菜单...
+
+    def create_navigation(self):
+        self.navigation_frame = tk.Frame(self, width=150, bg="#f0f0f0")
+        self.navigation_frame.pack(side=tk.LEFT, fill=tk.Y)
+
+        navigation_items = ["导航 1", "导航 2", "导航 3", "导航 4", "导航 5", "导航 6", "导航 7", "导航 8", "导航 9", "导航 10"]
+        # self.navigation_buttons = []
+        for item in navigation_items:
+            button = tk.Button(self.navigation_frame, text=item, command=lambda i=item: self.show_content(i))
+            button.pack(fill=tk.X, pady=5)
+            # self.navigation_buttons.append(button)
+
+    def create_content_area(self):
+        self.content_frame = tk.Frame(self)
+        self.content_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
+
+    def show_content(self, item):
+        print(f"---> {item},{self.content_cache}")
+        for key, value in self.content_cache.items():
+            if key != item:
+                value.pack_forget()
+        if item in self.content_cache:
+            content = self.content_cache[item]
+            content.pack(fill=tk.BOTH, expand=True)
+        else:
+            content = tk.Frame(self.content_frame)
+            content.pack(fill=tk.BOTH, expand=True)
+
+            # 表单区域
+            form_frame = tk.Frame(content)
+            form_frame.pack(side=tk.TOP, fill=tk.X)
+
+            tk.Label(form_frame, text="姓名:").grid(row=0, column=0, sticky="w")
+            name_entry = Entry(form_frame)
+            name_entry.grid(row=0, column=1)
+
+            tk.Label(form_frame, text="年龄:").grid(row=1, column=0, sticky="w")
+            age_entry = Entry(form_frame)
+            age_entry.grid(row=1, column=1)
+
+            Button(form_frame, text="保存").grid(row=2, column=1, sticky="e")
+
+            # 日志区域
+            log_text = Text(content, height=10)
+            log_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
+            log_text.insert(tk.END, f"导航 {item} 被点击\n")
+
+            # 图片预览区域
+            image_label = Label(content)
+            image_label.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
+
+            try:
+                image = Image.open("../../assets/img.png")  # 替换为您的图片路径
+                photo = ImageTk.PhotoImage(image)
+                image_label.config(image=photo)
+                image_label.image = photo  # 保持对图片的引用
+            except FileNotFoundError:
+                log_text.insert(tk.END, "图片未找到\n")
+
+            self.content_cache[item] = content  # 缓存内容
+
+
+if __name__ == "__main__":
+    app = Application()
+    app.mainloop()

+ 236 - 0
test/deepcoin/test_deepcoin_control.py

@@ -0,0 +1,236 @@
+import logging
+import unittest
+
+from plat.deepcoin_control import DeepCoinControl
+
+logging.basicConfig(level=logging.INFO, force=True)  # 设置日志级别
+
+
+class MyTestCase(unittest.TestCase):
+    def setUp(self):
+        self.pc = DeepCoinControl('Deepcoin')
+
+        self.pc.connect_adb('127.0.0.1:6555')
+
+    def test_to_top_swipe(self):
+        """
+        滑动到顶部
+        """
+        self.pc.to_top_swipe()
+
+    def test_to_next_swipe(self):
+        """
+        滑动到下一屏
+        """
+        self.pc.to_next_swipe()
+
+    def test_save_point(self):
+        """
+        保存坐标
+        """
+        self.pc.save_point()
+
+    def test_slider_baozhengjin(self):
+        """
+        保证金滑块
+        """
+        self.pc.slider_baozhengjin_kaicang()
+
+    def test_click_kaicang(self):
+        """
+        开仓
+        """
+        self.pc.click_kaicang()
+
+    def test_click_pingchang(self):
+        """
+        平仓
+        """
+        self.pc.click_pingchang()
+
+    def test_select_weituo_xianjia(self):
+        """
+        选择限价委托
+        """
+        self.pc.select_kaicang_weituo_xianjia()
+
+    def test_click_price(self):
+        """
+        点击价格
+        """
+        self.pc.click_price_red()
+
+    def test_f1(self):
+        """
+        f1 开仓界面,仓位滑竿百分比(30-60)
+        """
+        self.pc.click_kaicang()
+        self.pc.slider_baozhengjin_kaicang()
+
+    def test_f2(self):
+        """
+        f2 确认开仓,开多 限价职中间数值
+        检查撤销限价委托单
+        """
+        self.pc.click_kaicang()
+
+        self.pc.select_kaicang_weituo_xianjia()
+        self.pc.d.sleep(0.1)
+
+        self.pc.click_price_red()
+
+        self.pc.text_xiadan_shuliang(3)
+
+        self.pc.click_mairu_kaiduo()
+
+    def test_f3(self):
+        """
+        F3 平仓界面 平空,仓位滑竿百分比(90-100)确认开仓,限价职中间数值
+        """
+        self.pc.to_top_swipe(sleep=0.2)
+        self.pc.click_pingchang()
+        self.pc.slider_baozhengjin_pingcang(offset=1)
+
+    def test_f4(self):
+        """
+        F4   确认平仓 平多 限价取中间数值 检查撤销限价委托单
+        """
+        self.pc.to_top_swipe(sleep=0.2)
+        self.pc.click_pingchang()
+        self.pc.select_kaicang_weituo_xianjia()
+        self.pc.click_price_green()
+        self.pc.text_xiadan_shuliang(3)
+        self.pc.click_maichu_pingduo()
+
+    def test_f5(self):
+        """
+        F5 开仓界面胂仓位滑竿百分比(30-60)
+        """
+        self.pc.to_top_swipe(sleep=0.2)
+        self.pc.click_kaicang()
+        self.pc.slider_baozhengjin_kaicang()
+
+    def test_f6(self):
+        """
+        F6 确认开仓, 开空 限价值中间数值
+        检查撤销限价委托单
+        """
+        self.pc.to_top_swipe(sleep=0.1)
+        self.pc.click_kaicang()
+        self.pc.select_kaicang_weituo_xianjia()
+        self.pc.click_price_red()
+        # self.pc.text_xiadan_shuliang(3)
+        self.pc.click_maichu_kaikong()
+
+    def test_f7(self):
+        """
+        F7    平仓界面二仓位滑竿百分比(90-100)
+        """
+        self.pc.to_top_swipe(sleep=0.2)
+        self.pc.click_pingchang()
+        self.pc.slider_baozhengjin_pingcang(offset=2)
+
+    def test_f8(self):
+        """
+        F8 确认平仓, 平空 限价职中间数值
+        检查撤销限价委托单
+        """
+        self.pc.to_top_swipe()
+
+        self.pc.d.sleep(0.1)
+
+        self.pc.click_pingchang()
+
+        self.pc.click_price_red()
+
+        self.pc.text_xiadan_shuliang(3)
+
+        self.pc.click_mairu_pingkong()
+
+    def test_jiao_yi(self):
+        x, y = self.pc.btn_jiao_yi()
+        logging.info(f"交易坐标: ({x},{y})")
+
+    def test_mairu_kaiduo(self):
+        x, y = self.pc.btn_mairu_kaiduo()
+        logging.info(f"买入开多: ({x},{y})")
+
+    def test_chichang(self):
+        self.pc.d.xpath()
+
+    def test_gengdan(self):
+        self.pc.to_next_swipe()
+        x, y = self.pc.btn_gengdan()
+        logging.info(f"跟单坐标: ({x},{y})")
+
+    def test_weituo(self):
+        self.pc.to_next_swipe()
+        x, y = self.pc.btn_weituo()
+        logging.info(f"委托坐标: ({x},{y})")
+
+    def test_gendan_click(self):
+        self.pc.click_xpath('//*[starts-with(@content-desc, "跟单(")]')
+
+    def test_yijianchedan_click(self):
+        """
+        一键撤单
+        """
+        self.pc.to_next_swipe()
+
+        self.pc.click_yijian_chedan()
+
+    def test_jiaoyi_select(self):
+        element = self.pc.d.xpath('//*[@content-desc="交易"]').get()
+
+        # 获取元素位置
+        bounds = element.info['bounds']
+        # 截图
+        screenshot = self.pc.d.screenshot()
+        # 转换为PIL图像
+        from PIL import Image
+        img = Image.fromarray(screenshot)
+        # 获取元素中心点颜色
+        x = (bounds['left'] + bounds['right']) // 2
+        y = (bounds['top'] + bounds['bottom']) // 2
+        return img.getpixel((x, y))
+
+    def test_slider_baozhengjin_pingcang(self):
+        """
+        平仓情况  保证金滑块
+        """
+        self.pc.slider_baozhengjin_pingcang()
+
+    def test_exists(self):
+        # b = self.pc.check_element_exists('//*[starts-with(@content-desc, "全部委托(")]')
+        # logging.info("是否存在: %s", b)
+        b = self.pc.check_element_exists('//*[@content-desc="限价委托"]')
+        logging.info("是否存在: %s", b)
+
+    def test_element(self):
+        element = self.pc.d.xpath('//*[@content-desc="交易"]').get()
+        logging.info("交易按钮: %s", element.info)
+
+    def test_input(self):
+        """
+        给指定xpath的输入框输入文本
+        """
+        self.pc.text_xiadan_shuliang(30)
+
+    def test_kaichang_queren(self):
+        """
+        开仓确认
+        """
+
+        x, y, _ = self.pc.get_point({
+            "name": "btn_kaicang_queren",
+            "desc": "开仓确认",
+            "xpath": '//*[@content-desc="开仓确认"]'
+        })
+        logging.info(f"开仓确认: ({x},{y})")
+
+        if self.pc.check_element_exists('//*[@content-desc="开仓确认"]'):
+            self.pc.click_xpath('//*[@content-desc="确认"]')
+
+
+if __name__ == '__main__':
+    unittest.main()

+ 0 - 119
test/deepcoin/test_point_collection.py

@@ -1,119 +0,0 @@
-import logging
-import unittest
-
-from plat.deepcoin.point_collection import PointCollection
-
-logging.basicConfig(level=logging.INFO, force=True)  # 设置日志级别
-
-
-class MyTestCase(unittest.TestCase):
-    def setUp(self):
-        self.pc = PointCollection('127.0.0.1:6555')
-
-    def test_to_top_swipe(self):
-        """
-        滑动到顶部
-        """
-        self.pc.to_top_swipe()
-
-    def test_to_next_swipe(self):
-        """
-        滑动到下一屏
-        """
-        self.pc.to_next_swipe()
-
-    def test_save_point(self):
-        """
-        保存坐标
-        """
-        self.pc.save_point()
-
-    def test_slider_baozhengjin(self):
-        """
-        保证金滑块
-        """
-        self.pc.slider_baozhengjin()
-
-    def test_click_kaicang(self):
-        """
-        开仓
-        """
-        self.pc.click_kaicang()
-
-    def test_click_pingchang(self):
-        """
-        平仓
-        """
-        self.pc.click_pingchang()
-
-    def test_select_weituo_xianjia(self):
-        """
-        选择限价委托
-        """
-        self.pc.select_weituo_xianjia()
-
-    def test_click_price(self):
-        """
-        点击价格
-        """
-        self.pc.click_price_red()
-
-    def test_f1(self):
-        """
-        f1 开仓界面,仓位滑竿百分比(30-60)
-        """
-        self.pc.click_kaicang()
-        self.pc.slider_baozhengjin()
-
-    def test_f2(self):
-        """
-        f2 确认开仓,限价职中间数值
-        检查撤销限价委托单
-        """
-
-    def test_f3(self):
-        """
-        F3 开仓界面,仓位滑竿百分比(30-60)确认开仓,限价职中间数值
-        """
-
-    def test_f4(self):
-        """
-        F4   确认开仓限价职中间数值 检查撤销限价委托单
-        """
-
-    def test_f5(self):
-        """
-        F5 开仓界面胂仓位滑竿百分比(30-60)
-        """
-
-    def test_f6(self):
-        """
-        F6 确认开仓,限价职中间数值
-        检查撤销限价委托单
-        """
-
-    def test_f7(self):
-        """
-        F7    平仓界面二仓位滑竿百分比(90-100)
-        """
-
-    def test_f8(self):
-        """
-        F8 确认平仓,限价职中间数值
-        检查撤销限价委托单
-        """
-
-    def test_jiao_yi(self):
-        x, y = self.pc.btn_jiao_yi()
-        logging.info(f"交易坐标: ({x},{y})")
-
-    def test_mairu_kaiduo(self):
-        x, y = self.pc.btn_mairu_kaiduo()
-        logging.info(f"买入开多: ({x},{y})")
-
-    def test_chichang(self):
-        self.pc.d.xpath()
-
-
-if __name__ == '__main__':
-    unittest.main()

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.