Hello.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. from multiprocessing import Process, Queue, freeze_support
  2. import threading
  3. import time
  4. import os
  5. import webbrowser
  6. import random
  7. import flask
  8. import json
  9. from newtkinter import DragWindow, center_windows
  10. app = flask.Flask(__name__, static_url_path='')
  11. pic_list = os.listdir(f'{os.getcwd()}{os.sep}static{os.sep}Pic')
  12. del pic_list[pic_list.index('favicon.ico')]
  13. pic_list = random.sample(pic_list, 10)
  14. queue_box = []
  15. var_box = []
  16. new_queue_box = True
  17. new_var_box = True
  18. @app.route('/img', methods=['get'])
  19. def get_img():
  20. pic = pic_list[int(str(time.time())[-1])]
  21. print(pic)
  22. return pic
  23. @app.route('/sent', methods=['get'])
  24. def sent():
  25. value = flask.request.args.get("message", '')
  26. index = queue_box.index(flask.request.args.get("index", queue_box[0]))
  27. queue_controller.put(value, index)
  28. return 'success'
  29. @app.route('/update')
  30. def update():
  31. global new_queue_box, new_var_box
  32. must = flask.request.args.get("must", 'NO')
  33. if must == 'must':
  34. new_queue_box = True
  35. new_var_box = True
  36. repo = {'queue': queue_box, 'var': var_box}
  37. if new_queue_box or new_var_box:
  38. repo['status'] = 'YES'
  39. else:
  40. repo['status'] = "NO"
  41. new_queue_box = False
  42. new_var_box = False
  43. return repo
  44. def update_queue_box(queue_list):
  45. global queue_box, new_queue_box
  46. queue_box = queue_list
  47. new_queue_box = True
  48. def update_var_box(var_dict, var_from):
  49. global var_box, new_var_box
  50. var = []
  51. for name in var_dict:
  52. var.append(f'{name}[{var_from[name]}] : {var_dict[name]}')
  53. var_box = var
  54. new_var_box = True
  55. class QueueController:
  56. def __init__(self):
  57. self.in_dict = {}
  58. self.out_dict = {}
  59. self.var_dict = {}
  60. self.queue_list = []
  61. self.var_from = {}
  62. self.update_var = lambda x, y: None
  63. self.update_queue = lambda x: None
  64. self.run = False
  65. self.stop_str = "__--$$stop_process$$--__"
  66. def can_stop(self):
  67. return len(self.out_dict) == 0
  68. def __call__(self, *args, **kwargs):
  69. self.run = True
  70. def done():
  71. while self.run:
  72. stop_pid = []
  73. old_var = list(self.var_dict.keys())
  74. for out in self.out_dict:
  75. output: Queue = self.out_dict[out]
  76. if output.empty():
  77. continue
  78. dict_index = f'var_{len(self.var_dict)}'
  79. get_out = output.get()
  80. if get_out == self.stop_str:
  81. stop_pid.append(out)
  82. else:
  83. self.var_dict[dict_index] = get_out
  84. self.var_from[dict_index] = out
  85. if old_var != list(self.var_dict.keys()):
  86. self.update_var(self.var_dict, self.var_from)
  87. if stop_pid:
  88. for i in stop_pid:
  89. del self.in_dict[i]
  90. del self.out_dict[i]
  91. self.queue_list = list(self.in_dict.keys())
  92. self.update_queue(self.queue_list.copy())
  93. t = threading.Thread(target=done)
  94. t.setDaemon(True)
  95. t.start()
  96. return self
  97. def stop(self):
  98. self.run = False
  99. def add_queue(self, inqueue, outqueue, name):
  100. self.stop()
  101. time.sleep(0.5)
  102. self.in_dict[name] = inqueue
  103. self.out_dict[name] = outqueue
  104. self.queue_list = list(self.in_dict.keys())
  105. self.update_queue(self.queue_list.copy())
  106. self.update_var(self.var_dict, self.var_from)
  107. def init(self, update_var, update_queue):
  108. self.update_var = update_var
  109. self.update_queue = update_queue
  110. self.update_queue(list(self.in_dict.keys()))
  111. self.update_var(self.var_dict, self.var_from)
  112. def put(self, value: str, index):
  113. name_space = self.var_dict.copy()
  114. name_space.update(globals())
  115. in_queue = self.in_dict[self.queue_list[index]]
  116. if value.startswith('put_var '):
  117. var_name = value[7:]
  118. in_queue.put(self.var_dict.get(var_name))
  119. elif value.startswith('put_eval '):
  120. in_queue.put(eval(value[8:]), name_space)
  121. elif value.startswith('put_file ') and value.startswith('.py'):
  122. try:
  123. with open(value[4:], 'r') as f:
  124. code_file = f.read()
  125. new_name_space = name_space
  126. exec(code_file, new_name_space)
  127. dict_index = f'var_{len(self.var_dict)}'
  128. in_queue.put(list(new_name_space.keys()))
  129. self.var_dict[dict_index] = new_name_space.copy()
  130. self.var_from[dict_index] = 'self'
  131. except BaseException as e:
  132. in_queue.put(str(e))
  133. else:
  134. in_queue.put(value)
  135. queue_controller = QueueController()
  136. queue_controller.init(update_var_box, update_queue_box)
  137. def progress_bar(func):
  138. def run(*agrs, **kwargs):
  139. in_queue, out_queue = func(*agrs, **kwargs)
  140. pid = out_queue.get()
  141. name = func.__name__
  142. queue_controller.add_queue(in_queue, out_queue, f'{name}_{pid}')
  143. queue_controller()
  144. time.sleep(1)
  145. return 'run success'
  146. return run
  147. def draftboard_main(in_queue, out_queue):
  148. out_queue.put(str(os.getpid()))
  149. from draftboard import draw_main
  150. out_queue.put('start')
  151. # 不需要等待
  152. draw_main(in_queue, out_queue)
  153. @app.route('/communication')
  154. def communication():
  155. return app.send_static_file(r'Communication.html')
  156. @app.route('/')
  157. def hello():
  158. return app.send_static_file('Hello.html')
  159. @app.route('/draftboard')
  160. def draftboard():
  161. return draftboard_run()
  162. @progress_bar
  163. def draftboard_run():
  164. in_queue = Queue(10)
  165. out_queue = Queue(10)
  166. Process(target=draftboard_main, args=(in_queue, out_queue)).start()
  167. return in_queue, out_queue
  168. def datascience_main(in_queue, out_queue):
  169. out_queue.put(str(os.getpid()))
  170. from datascience import machine_learning
  171. out_queue.put('start')
  172. time.sleep(0.5)
  173. machine_learning(in_queue, out_queue)
  174. @app.route('/datascience')
  175. def datascience():
  176. return datascience_run()
  177. @progress_bar
  178. def datascience_run():
  179. in_queue = Queue(10)
  180. out_queue = Queue(10)
  181. Process(target=datascience_main, args=(in_queue, out_queue)).start()
  182. return in_queue, out_queue
  183. def functionmapping_main(in_queue, out_queue):
  184. out_queue.put(str(os.getpid()))
  185. from funcsystem.map import function_mapping
  186. out_queue.put('start')
  187. time.sleep(0.5)
  188. function_mapping(in_queue, out_queue)
  189. @app.route('/functionmapping')
  190. def functionmapping():
  191. return functionmapping_run()
  192. @progress_bar
  193. def functionmapping_run():
  194. in_queue = Queue(10)
  195. out_queue = Queue(10)
  196. Process(target=functionmapping_main, args=(in_queue, out_queue)).start()
  197. return in_queue, out_queue
  198. def functionfactory_main(in_queue, out_queue):
  199. out_queue.put(str(os.getpid()))
  200. from funcsystem.factory import function_factory_main
  201. out_queue.put('start')
  202. time.sleep(0.5)
  203. function_factory_main(in_queue, out_queue)
  204. @app.route('/functionfactory')
  205. def functionfactory():
  206. return functionfactory_run()
  207. @progress_bar
  208. def functionfactory_run():
  209. in_queue = Queue(10)
  210. out_queue = Queue(10)
  211. Process(target=functionfactory_main, args=(in_queue, out_queue)).start()
  212. return in_queue, out_queue
  213. def algebraicfactory_main(in_queue, out_queue):
  214. out_queue.put(str(os.getpid()))
  215. from algebraicfactory import algebraic_factory_main
  216. out_queue.put('start')
  217. time.sleep(0.5)
  218. algebraic_factory_main(in_queue, out_queue)
  219. @app.route('/algebraicfactory')
  220. def algebraicfactory():
  221. return algebraicfactory_run()
  222. @progress_bar
  223. def algebraicfactory_run():
  224. in_queue = Queue(10)
  225. out_queue = Queue(10)
  226. Process(target=algebraicfactory_main, args=(in_queue, out_queue)).start()
  227. return in_queue, out_queue
  228. def machinelearner_main(in_queue, out_queue):
  229. out_queue.put(str(os.getpid()))
  230. from machinelearning import machine_learning
  231. out_queue.put('start')
  232. time.sleep(0.5)
  233. machine_learning(in_queue, out_queue)
  234. @app.route('/machinelearner')
  235. def machinelearner():
  236. return machinelearner_run()
  237. @progress_bar
  238. def machinelearner_run():
  239. in_queue = Queue(10)
  240. out_queue = Queue(10)
  241. Process(target=machinelearner_main, args=(in_queue, out_queue)).start()
  242. return in_queue, out_queue
  243. def git_main(in_queue, out_queue):
  244. out_queue.put(str(os.getpid()))
  245. from gitrepo import git_main
  246. out_queue.put('start')
  247. time.sleep(0.5)
  248. git_main(in_queue, out_queue)
  249. @app.route('/git')
  250. def git():
  251. return git_run()
  252. @progress_bar
  253. def git_run():
  254. in_queue = Queue(10)
  255. out_queue = Queue(10)
  256. Process(target=git_main, args=(in_queue, out_queue)).start()
  257. return in_queue, out_queue
  258. def crawler_main(in_queue, out_queue):
  259. out_queue.put(str(os.getpid()))
  260. from crawler import crawler_main
  261. out_queue.put('start')
  262. time.sleep(0.5)
  263. crawler_main(in_queue, out_queue)
  264. @app.route('/crawler')
  265. def crawler():
  266. return crawler_run()
  267. @progress_bar
  268. def crawler_run():
  269. in_queue = Queue(10)
  270. out_queue = Queue(10)
  271. Process(target=crawler_main, args=(in_queue, out_queue)).start()
  272. return in_queue, out_queue
  273. def system_main(in_queue, out_queue):
  274. out_queue.put(str(os.getpid()))
  275. from system.gui import system_main
  276. out_queue.put('start')
  277. time.sleep(0.5)
  278. system_main(in_queue, out_queue)
  279. @app.route('/system')
  280. def system():
  281. return system_run()
  282. @progress_bar
  283. def system_run(): # 不需要进度条
  284. in_queue = Queue(10)
  285. out_queue = Queue(10)
  286. Process(target=system_main, args=(in_queue, out_queue)).start()
  287. return in_queue, out_queue
  288. def to_website():
  289. t = threading.Thread(target=webbrowser.open, args=('https://cotan.songzh.website/',))
  290. t.start()
  291. if __name__ == "__main__":
  292. freeze_support()
  293. app.run()