| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- import datetime
- import logging
- import tkinter as tk
- from tkinter import ttk
- from tornado import concurrent
- from control.base.base_control import BaseControl, UIControl
- def loading(top, func):
- """
- 等待加载完成
- :return:
- """
- # 创建加载指示器
- loading_window = tk.Toplevel(top)
- loading_window.title("连接中")
- loading_window.geometry("200x100")
- loading_window.transient(top) # 设置为模态
- loading_window.grab_set() # 设置为模态
- loading_window.overrideredirect(True) # 移除窗口边框和按钮
- # 相对于父窗口居中显示
- window_width = loading_window.winfo_reqwidth()
- window_height = loading_window.winfo_reqheight()
- parent_x = top.winfo_rootx()
- parent_y = top.winfo_rooty()
- parent_width = top.winfo_width()
- parent_height = top.winfo_height()
- position_right = parent_x + (parent_width - window_width) // 2
- position_down = parent_y + (parent_height - window_height) // 2
- loading_window.geometry(f"+{position_right}+{position_down}")
- loading_label = ttk.Label(loading_window, text="连接中...", padding=20)
- loading_label.pack(expand=True)
- def thread_task():
- try:
- func()
- finally:
- # 在主线程中销毁加载指示器
- top.after(0, lambda: [loading_window.grab_release(), loading_window.destroy()])
- import threading
- thread = threading.Thread(target=thread_task)
- # thread.daemon = True # 设置为守护线程,这样主程序退出时线程会自动结束
- thread.start()
- pass
- class ControlUtils(UIControl):
- # def parallel_process_list(data):
- # """并行处理列表数据"""
- # results = []
- # with concurrent.futures.ProcessPoolExecutor() as executor:
- # # 使用 map 函数将处理函数应用到列表的每个元素
- # # executor.map 返回一个迭代器,包含处理结果
- # for result in executor.map(process_item, data):
- # results.append(result)
- # return results
- def __init__(self, **kwargs):
- self.top = kwargs.get('top', None)
- pass
- def event_1(self, **kwargs):
- logging.info('执行event1')
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行1=event1=>{k},{v}')
- v['control'].event_1(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def event_2(self, **kwargs):
- """
- 点击全部的 event2
- :return:
- """
- logging.info('执行event2')
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- kwargs['action'] = '开仓:买入/开多'
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- log.see(tk.END)
- v['control'].event_2(**kwargs)
- v['control'].event_10(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- pass
- def event_3(self, **kwargs):
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行=event3=>{k},{v}')
- v['control'].event_3(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def event_4(self, **kwargs):
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- kwargs['action'] = '平仓:卖出/平多'
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行=event4=>{k},{v}')
- v['control'].event_4(**kwargs)
- v['control'].event_10(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def event_5(self, **kwargs):
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行=event5=>{k},{v}')
- v['control'].event_5(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def event_6(self, **kwargs):
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- kwargs['action'] = '开仓:卖出/开空'
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行=event6=>{k},{v}')
- v['control'].event_6(**kwargs)
- v['control'].event_10(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def event_7(self, **kwargs):
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行=event7=>{k},{v}')
- v['control'].event_7(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def event_8(self, **kwargs):
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- kwargs['action'] = '平仓:买入/平空'
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行=event8=>{k},{v}')
- v['control'].event_8(**kwargs)
- v['control'].event_10(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def event_9(self, **kwargs):
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行=event9=>{k},{v}')
- v['control'].event_9(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def event_10(self, **kwargs):
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- kwargs['action'] = '查看结果'
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行=event10=>{k},{v}')
- v['control'].event_10(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def event_11(self, **kwargs):
- """
- 一键全平
- :param kwargs:
- :return:
- """
- log = kwargs.get('log')
- log.delete("1.0", tk.END)
- kwargs['action'] = '一键全平'
- def process_item(item):
- k, v = item
- try:
- # 确保子进程中的日志配置
- logging.basicConfig(level=logging.INFO)
- logging.info(f'执行=event11=>{k},{v}')
- v['control'].event_11(**kwargs)
- v['control'].event_10(**kwargs)
- return True
- except Exception as e:
- logging.error(f"处理元素 {k} 时发生错误: {e}")
- return False
- self._event(process_item, **kwargs)
- def _event(self, process_item, **kwargs):
- log = kwargs.get('log')
- def func():
- with concurrent.futures.ThreadPoolExecutor() as executor:
- futures = []
- for item in BaseControl.connect_dict.items():
- logging.info(f'执行=event=>{item}')
- future = executor.submit(process_item, item)
- futures.append(future)
- k, v = item
- # 获取当前日期和时间
- now = datetime.datetime.now()
- # 格式化日期和时间为 "年月日-月月-日日 时时:分分:秒秒"
- formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
- log.insert(tk.INSERT, f"======下发命令============\n"
- f"手机:{v['name']}\n"
- f"操作:{kwargs['action']}\n"
- f"时间:{formatted_time}\n"
- f"===========================\n")
- for future in concurrent.futures.as_completed(futures):
- try:
- result = future.result()
- logging.info(f"任务完成状态: {result}")
- except Exception as e:
- logging.error(f"任务执行出错: {e}")
- loading(self.top, func)
- pass
|