control_util.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. import datetime
  2. import logging
  3. import tkinter as tk
  4. from tkinter import ttk
  5. from tornado import concurrent
  6. from control.base.base_control import BaseControl, UIControl
  7. def loading(top, func):
  8. """
  9. 等待加载完成
  10. :return:
  11. """
  12. # 创建加载指示器
  13. loading_window = tk.Toplevel(top)
  14. loading_window.title("连接中")
  15. loading_window.geometry("200x100")
  16. loading_window.transient(top) # 设置为模态
  17. loading_window.grab_set() # 设置为模态
  18. loading_window.overrideredirect(True) # 移除窗口边框和按钮
  19. # 相对于父窗口居中显示
  20. window_width = loading_window.winfo_reqwidth()
  21. window_height = loading_window.winfo_reqheight()
  22. parent_x = top.winfo_rootx()
  23. parent_y = top.winfo_rooty()
  24. parent_width = top.winfo_width()
  25. parent_height = top.winfo_height()
  26. position_right = parent_x + (parent_width - window_width) // 2
  27. position_down = parent_y + (parent_height - window_height) // 2
  28. loading_window.geometry(f"+{position_right}+{position_down}")
  29. loading_label = ttk.Label(loading_window, text="连接中...", padding=20)
  30. loading_label.pack(expand=True)
  31. def thread_task():
  32. try:
  33. func()
  34. finally:
  35. # 在主线程中销毁加载指示器
  36. top.after(0, lambda: [loading_window.grab_release(), loading_window.destroy()])
  37. import threading
  38. thread = threading.Thread(target=thread_task)
  39. # thread.daemon = True # 设置为守护线程,这样主程序退出时线程会自动结束
  40. thread.start()
  41. pass
  42. class ControlUtils(UIControl):
  43. # def parallel_process_list(data):
  44. # """并行处理列表数据"""
  45. # results = []
  46. # with concurrent.futures.ProcessPoolExecutor() as executor:
  47. # # 使用 map 函数将处理函数应用到列表的每个元素
  48. # # executor.map 返回一个迭代器,包含处理结果
  49. # for result in executor.map(process_item, data):
  50. # results.append(result)
  51. # return results
  52. def __init__(self, **kwargs):
  53. self.top = kwargs.get('top', None)
  54. pass
  55. def event_1(self, **kwargs):
  56. logging.info('执行event1')
  57. log = kwargs.get('log')
  58. log.delete("1.0", tk.END)
  59. def process_item(item):
  60. k, v = item
  61. try:
  62. # 确保子进程中的日志配置
  63. logging.basicConfig(level=logging.INFO)
  64. logging.info(f'执行1=event1=>{k},{v}')
  65. v['control'].event_1(**kwargs)
  66. return True
  67. except Exception as e:
  68. logging.error(f"处理元素 {k} 时发生错误: {e}")
  69. return False
  70. self._event(process_item, **kwargs)
  71. def event_2(self, **kwargs):
  72. """
  73. 点击全部的 event2
  74. :return:
  75. """
  76. logging.info('执行event2')
  77. log = kwargs.get('log')
  78. log.delete("1.0", tk.END)
  79. kwargs['action'] = '开仓:买入/开多'
  80. def process_item(item):
  81. k, v = item
  82. try:
  83. # 确保子进程中的日志配置
  84. logging.basicConfig(level=logging.INFO)
  85. log.see(tk.END)
  86. v['control'].event_2(**kwargs)
  87. v['control'].event_10(**kwargs)
  88. return True
  89. except Exception as e:
  90. logging.error(f"处理元素 {k} 时发生错误: {e}")
  91. return False
  92. self._event(process_item, **kwargs)
  93. pass
  94. def event_3(self, **kwargs):
  95. log = kwargs.get('log')
  96. log.delete("1.0", tk.END)
  97. def process_item(item):
  98. k, v = item
  99. try:
  100. # 确保子进程中的日志配置
  101. logging.basicConfig(level=logging.INFO)
  102. logging.info(f'执行=event3=>{k},{v}')
  103. v['control'].event_3(**kwargs)
  104. return True
  105. except Exception as e:
  106. logging.error(f"处理元素 {k} 时发生错误: {e}")
  107. return False
  108. self._event(process_item, **kwargs)
  109. def event_4(self, **kwargs):
  110. log = kwargs.get('log')
  111. log.delete("1.0", tk.END)
  112. kwargs['action'] = '平仓:卖出/平多'
  113. def process_item(item):
  114. k, v = item
  115. try:
  116. # 确保子进程中的日志配置
  117. logging.basicConfig(level=logging.INFO)
  118. logging.info(f'执行=event4=>{k},{v}')
  119. v['control'].event_4(**kwargs)
  120. v['control'].event_10(**kwargs)
  121. return True
  122. except Exception as e:
  123. logging.error(f"处理元素 {k} 时发生错误: {e}")
  124. return False
  125. self._event(process_item, **kwargs)
  126. def event_5(self, **kwargs):
  127. log = kwargs.get('log')
  128. log.delete("1.0", tk.END)
  129. def process_item(item):
  130. k, v = item
  131. try:
  132. # 确保子进程中的日志配置
  133. logging.basicConfig(level=logging.INFO)
  134. logging.info(f'执行=event5=>{k},{v}')
  135. v['control'].event_5(**kwargs)
  136. return True
  137. except Exception as e:
  138. logging.error(f"处理元素 {k} 时发生错误: {e}")
  139. return False
  140. self._event(process_item, **kwargs)
  141. def event_6(self, **kwargs):
  142. log = kwargs.get('log')
  143. log.delete("1.0", tk.END)
  144. kwargs['action'] = '开仓:卖出/开空'
  145. def process_item(item):
  146. k, v = item
  147. try:
  148. # 确保子进程中的日志配置
  149. logging.basicConfig(level=logging.INFO)
  150. logging.info(f'执行=event6=>{k},{v}')
  151. v['control'].event_6(**kwargs)
  152. v['control'].event_10(**kwargs)
  153. return True
  154. except Exception as e:
  155. logging.error(f"处理元素 {k} 时发生错误: {e}")
  156. return False
  157. self._event(process_item, **kwargs)
  158. def event_7(self, **kwargs):
  159. log = kwargs.get('log')
  160. log.delete("1.0", tk.END)
  161. def process_item(item):
  162. k, v = item
  163. try:
  164. # 确保子进程中的日志配置
  165. logging.basicConfig(level=logging.INFO)
  166. logging.info(f'执行=event7=>{k},{v}')
  167. v['control'].event_7(**kwargs)
  168. return True
  169. except Exception as e:
  170. logging.error(f"处理元素 {k} 时发生错误: {e}")
  171. return False
  172. self._event(process_item, **kwargs)
  173. def event_8(self, **kwargs):
  174. log = kwargs.get('log')
  175. log.delete("1.0", tk.END)
  176. kwargs['action'] = '平仓:买入/平空'
  177. def process_item(item):
  178. k, v = item
  179. try:
  180. # 确保子进程中的日志配置
  181. logging.basicConfig(level=logging.INFO)
  182. logging.info(f'执行=event8=>{k},{v}')
  183. v['control'].event_8(**kwargs)
  184. v['control'].event_10(**kwargs)
  185. return True
  186. except Exception as e:
  187. logging.error(f"处理元素 {k} 时发生错误: {e}")
  188. return False
  189. self._event(process_item, **kwargs)
  190. def event_9(self, **kwargs):
  191. log = kwargs.get('log')
  192. log.delete("1.0", tk.END)
  193. def process_item(item):
  194. k, v = item
  195. try:
  196. # 确保子进程中的日志配置
  197. logging.basicConfig(level=logging.INFO)
  198. logging.info(f'执行=event9=>{k},{v}')
  199. v['control'].event_9(**kwargs)
  200. return True
  201. except Exception as e:
  202. logging.error(f"处理元素 {k} 时发生错误: {e}")
  203. return False
  204. self._event(process_item, **kwargs)
  205. def event_10(self, **kwargs):
  206. log = kwargs.get('log')
  207. log.delete("1.0", tk.END)
  208. kwargs['action'] = '查看结果'
  209. def process_item(item):
  210. k, v = item
  211. try:
  212. # 确保子进程中的日志配置
  213. logging.basicConfig(level=logging.INFO)
  214. logging.info(f'执行=event10=>{k},{v}')
  215. v['control'].event_10(**kwargs)
  216. return True
  217. except Exception as e:
  218. logging.error(f"处理元素 {k} 时发生错误: {e}")
  219. return False
  220. self._event(process_item, **kwargs)
  221. def event_11(self, **kwargs):
  222. """
  223. 一键全平
  224. :param kwargs:
  225. :return:
  226. """
  227. log = kwargs.get('log')
  228. log.delete("1.0", tk.END)
  229. kwargs['action'] = '一键全平'
  230. def process_item(item):
  231. k, v = item
  232. try:
  233. # 确保子进程中的日志配置
  234. logging.basicConfig(level=logging.INFO)
  235. logging.info(f'执行=event11=>{k},{v}')
  236. v['control'].event_11(**kwargs)
  237. v['control'].event_10(**kwargs)
  238. return True
  239. except Exception as e:
  240. logging.error(f"处理元素 {k} 时发生错误: {e}")
  241. return False
  242. self._event(process_item, **kwargs)
  243. def _event(self, process_item, **kwargs):
  244. log = kwargs.get('log')
  245. def func():
  246. with concurrent.futures.ThreadPoolExecutor() as executor:
  247. futures = []
  248. for item in BaseControl.connect_dict.items():
  249. logging.info(f'执行=event=>{item}')
  250. future = executor.submit(process_item, item)
  251. futures.append(future)
  252. k, v = item
  253. # 获取当前日期和时间
  254. now = datetime.datetime.now()
  255. # 格式化日期和时间为 "年月日-月月-日日 时时:分分:秒秒"
  256. formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
  257. log.insert(tk.INSERT, f"======下发命令============\n"
  258. f"手机:{v['name']}\n"
  259. f"操作:{kwargs['action']}\n"
  260. f"时间:{formatted_time}\n"
  261. f"===========================\n")
  262. for future in concurrent.futures.as_completed(futures):
  263. try:
  264. result = future.result()
  265. logging.info(f"任务完成状态: {result}")
  266. except Exception as e:
  267. logging.error(f"任务执行出错: {e}")
  268. loading(self.top, func)
  269. pass