Hello.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. from multiprocessing import Process, Queue, freeze_support
  2. import threading
  3. from _tkinter import TclError
  4. import tkinter
  5. from tkinter import ttk
  6. import tkinter.font as tkfont
  7. from PIL import ImageTk, Image
  8. import time
  9. import os
  10. import tkinter.messagebox
  11. import webbrowser
  12. import random
  13. <<<<<<< Updated upstream
  14. from newtkinter import DragWindow, center_windows
  15. =======
  16. import flask
  17. >>>>>>> Stashed changes
  18. img = None
  19. SCREEN = None
  20. queue_screen = None
  21. draftboard_start = None
  22. datascience_start = None
  23. functionmapping_start = None
  24. functionfactory_start = None
  25. algebraicfactory_start = None
  26. machinelearner_start = None
  27. git_start = None
  28. crawlef_start = None
  29. title_color = '#F0FFFF'
  30. button_color = '#FFFFFF'
  31. button_cursor = 'tcross'
  32. pic_list = os.listdir(f'{os.getcwd()}{os.sep}Pic')
  33. del pic_list[pic_list.index('favicon.ico')]
  34. pic_list = random.sample(pic_list, 10)
  35. class QueueController:
  36. def __init__(self):
  37. self.in_dict = {}
  38. self.out_dict = {}
  39. self.var_dict = {}
  40. self.queue_list = []
  41. self.var_from = {}
  42. self.update_var = lambda x, y: None
  43. self.update_queue = lambda x: None
  44. self.run = False
  45. self.stop_str = "__--$$stop_process$$--__"
  46. def can_stop(self):
  47. return len(self.out_dict) == 0
  48. def __call__(self, *args, **kwargs):
  49. self.run = True
  50. def done():
  51. while self.run:
  52. stop_pid = []
  53. old_var = list(self.var_dict.keys())
  54. for out in self.out_dict:
  55. output: Queue = self.out_dict[out]
  56. if output.empty():
  57. continue
  58. dict_index = f'var_{len(self.var_dict)}'
  59. get_out = output.get()
  60. if get_out == self.stop_str:
  61. stop_pid.append(out)
  62. else:
  63. self.var_dict[dict_index] = get_out
  64. self.var_from[dict_index] = out
  65. if old_var != list(self.var_dict.keys()):
  66. self.update_var(self.var_dict, self.var_from)
  67. if stop_pid:
  68. for i in stop_pid:
  69. del self.in_dict[i]
  70. del self.out_dict[i]
  71. self.queue_list = list(self.in_dict.keys())
  72. self.update_queue(self.queue_list.copy())
  73. t = threading.Thread(target=done)
  74. t.setDaemon(True)
  75. t.start()
  76. return self
  77. def stop(self):
  78. self.run = False
  79. def add_queue(self, inqueue, outqueue, name):
  80. self.stop()
  81. self.in_dict[name] = inqueue
  82. self.out_dict[name] = outqueue
  83. self.queue_list = list(self.in_dict.keys())
  84. self.update_queue(self.queue_list.copy())
  85. self.update_var(self.var_dict, self.var_from)
  86. def init(self, update_var, update_queue):
  87. self.update_var = update_var
  88. self.update_queue = update_queue
  89. self.update_queue(list(self.in_dict.keys()))
  90. self.update_var(self.var_dict, self.var_from)
  91. def put(self, value: str, index):
  92. name_space = self.var_dict.copy()
  93. name_space.update(globals())
  94. in_queue = self.in_dict[self.queue_list[index]]
  95. if value.startswith('put_var '):
  96. var_name = value[7:]
  97. in_queue.put(self.var_dict.get(var_name))
  98. elif value.startswith('put_eval '):
  99. in_queue.put(eval(value[8:]), name_space)
  100. elif value.startswith('put_file ') and value.startswith('.py'):
  101. try:
  102. with open(value[4:], 'r') as f:
  103. code_file = f.read()
  104. new_name_space = name_space
  105. exec(code_file, new_name_space)
  106. dict_index = f'var_{len(self.var_dict)}'
  107. in_queue.put(list(new_name_space.keys()))
  108. self.var_dict[dict_index] = new_name_space.copy()
  109. self.var_from[dict_index] = 'self'
  110. except BaseException as e:
  111. in_queue.put(str(e))
  112. else:
  113. in_queue.put(value)
  114. queue_controller = QueueController()
  115. def progress_bar(func):
  116. def make_bar(*agrs, **kwargs):
  117. SCREEN.update()
  118. in_queue: Queue
  119. out_queue: Queue
  120. in_queue, out_queue = func(*agrs, **kwargs)
  121. pid = out_queue.get()
  122. name = func.__name__
  123. queue_controller.add_queue(in_queue, out_queue, f'{name}_{pid}')
  124. progress_screen = tkinter.Toplevel()
  125. progress_screen.title('系统持续加载中...')
  126. progress_screen.geometry("+10+10") # 设置所在位置
  127. progress = ttk.Progressbar(
  128. progress_screen, orient="horizontal", length=300, mode="determinate"
  129. )
  130. progress.pack()
  131. progress_screen.resizable(width=False, height=False)
  132. progress["maximum"] = 10
  133. progress["value"] = 0
  134. i = 0
  135. a = 10
  136. while out_queue.empty():
  137. i += 1
  138. a += 1
  139. try:
  140. progress["value"] = i
  141. progress["maximum"] = a
  142. progress_screen.update()
  143. except TclError:
  144. pass
  145. SCREEN.update()
  146. time.sleep(0.015)
  147. try:
  148. out_queue.get()
  149. t = 0.3
  150. for di in range(10):
  151. t -= 0.03
  152. progress_screen.title(f'检查({round(t,3)})...')
  153. progress["value"] = i + di
  154. progress_screen.update()
  155. time.sleep(0.03)
  156. progress_screen.destroy()
  157. except TclError:
  158. pass
  159. queue_controller()
  160. return make_bar
  161. def draftboard_main(in_queue, out_queue):
  162. out_queue.put(str(os.getpid()))
  163. from draftboard import draw_main
  164. out_queue.put('start')
  165. # 不需要等待
  166. draw_main(in_queue, out_queue)
  167. @progress_bar
  168. def draftboard_run():
  169. in_queue = Queue(10)
  170. out_queue = Queue(10)
  171. Process(target=draftboard_main, args=(in_queue, out_queue)).start()
  172. return in_queue, out_queue
  173. def datascience_main(in_queue, out_queue):
  174. out_queue.put(str(os.getpid()))
  175. from datascience import machine_learning
  176. out_queue.put('start')
  177. time.sleep(0.5)
  178. machine_learning(in_queue, out_queue)
  179. @progress_bar
  180. def datascience_run():
  181. in_queue = Queue(10)
  182. out_queue = Queue(10)
  183. Process(target=datascience_main, args=(in_queue, out_queue)).start()
  184. return in_queue, out_queue
  185. def functionmapping_main(in_queue, out_queue):
  186. out_queue.put(str(os.getpid()))
  187. from funcsystem.map import function_mapping
  188. out_queue.put('start')
  189. time.sleep(0.5)
  190. function_mapping(in_queue, out_queue)
  191. @progress_bar
  192. def functionmapping_run():
  193. in_queue = Queue(10)
  194. out_queue = Queue(10)
  195. Process(target=functionmapping_main, args=(in_queue, out_queue)).start()
  196. return in_queue, out_queue
  197. def functionfactory_main(in_queue, out_queue):
  198. out_queue.put(str(os.getpid()))
  199. from funcsystem.factory import function_factory_main
  200. out_queue.put('start')
  201. time.sleep(0.5)
  202. function_factory_main(in_queue, out_queue)
  203. @progress_bar
  204. def functionfactory_run():
  205. in_queue = Queue(10)
  206. out_queue = Queue(10)
  207. Process(target=functionfactory_main, args=(in_queue, out_queue)).start()
  208. return in_queue, out_queue
  209. def algebraicfactory_main(in_queue, out_queue):
  210. out_queue.put(str(os.getpid()))
  211. from algebraicfactory import algebraic_factory_main
  212. out_queue.put('start')
  213. time.sleep(0.5)
  214. algebraic_factory_main(in_queue, out_queue)
  215. @progress_bar
  216. def algebraicfactory_run():
  217. in_queue = Queue(10)
  218. out_queue = Queue(10)
  219. Process(target=algebraicfactory_main, args=(in_queue, out_queue)).start()
  220. return in_queue, out_queue
  221. def machinelearner_main(in_queue, out_queue):
  222. out_queue.put(str(os.getpid()))
  223. from machinelearning import machine_learning
  224. out_queue.put('start')
  225. time.sleep(0.5)
  226. machine_learning(in_queue, out_queue)
  227. @progress_bar
  228. def machinelearner_run():
  229. in_queue = Queue(10)
  230. out_queue = Queue(10)
  231. Process(target=machinelearner_main, args=(in_queue, out_queue)).start()
  232. return in_queue, out_queue
  233. def git_main(in_queue, out_queue):
  234. out_queue.put(str(os.getpid()))
  235. from gitrepo import git_main
  236. out_queue.put('start')
  237. time.sleep(0.5)
  238. git_main(in_queue, out_queue)
  239. @progress_bar
  240. def git_run():
  241. in_queue = Queue(10)
  242. out_queue = Queue(10)
  243. Process(target=git_main, args=(in_queue, out_queue)).start()
  244. return in_queue, out_queue
  245. def crawler_main(in_queue, out_queue):
  246. out_queue.put(str(os.getpid()))
  247. from crawler import crawler_main
  248. out_queue.put('start')
  249. time.sleep(0.5)
  250. crawler_main(in_queue, out_queue)
  251. @progress_bar
  252. def crawlef_run():
  253. in_queue = Queue(10)
  254. out_queue = Queue(10)
  255. Process(target=crawler_main, args=(in_queue, out_queue)).start()
  256. return in_queue, out_queue
  257. def system_main(in_queue, out_queue):
  258. out_queue.put(str(os.getpid()))
  259. from system.gui import system_main
  260. out_queue.put('start')
  261. time.sleep(0.5)
  262. system_main(in_queue, out_queue)
  263. @progress_bar
  264. def system_run(): # 不需要进度条
  265. in_queue = Queue(10)
  266. out_queue = Queue(10)
  267. Process(target=system_main, args=(in_queue, out_queue)).start()
  268. return in_queue, out_queue
  269. def queuer():
  270. global title_color, button_color, button_cursor, queue_screen
  271. try:
  272. queue_screen.destroy()
  273. except (AttributeError, TclError):
  274. pass
  275. queue_screen = tkinter.Toplevel()
  276. queue_screen.title('通信管理器')
  277. queue_screen.resizable(width=False, height=False)
  278. queue_screen.geometry(f'+30+30')
  279. font = ("黑体", 11) # 设置字体
  280. def sent():
  281. nonlocal sent_text, queue_box
  282. value = sent_text.get()
  283. try:
  284. index = queue_box.curselection()[0]
  285. except IndexError:
  286. return
  287. queue_controller.put(value, index)
  288. width_b = 20
  289. height_b = 2
  290. a_x = 0
  291. a_y = 0
  292. sent_text = tkinter.Entry(queue_screen, width=width_b * 2)
  293. sent_text.grid(column=a_x, row=a_y, columnspan=2, sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N)
  294. tkinter.Button(queue_screen, bg=button_color, text='发送', command=sent, font=font, width=10, height=height_b)\
  295. .grid(column=a_x+2, row=a_y, sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N)
  296. a_y += 1
  297. queue_box = tkinter.Listbox(queue_screen, height=height_b * 8)
  298. queue_box.grid(column=a_x, row=a_y, columnspan=3, rowspan=8, sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N)
  299. a_x += 3
  300. a_y = 0
  301. var_box = tkinter.Listbox(queue_screen, width=width_b * 3, height=height_b * 9)
  302. var_box.grid(column=a_x, row=a_y, columnspan=3, rowspan=9, sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N)
  303. def update_queue_box(queue_list):
  304. try:
  305. queue_box.delete(0, tkinter.END)
  306. queue_box.insert(0, *queue_list)
  307. except TclError:
  308. pass
  309. def update_var_box(var_dict, var_from):
  310. var = []
  311. for name in var_dict:
  312. var.append(f'{name}[{var_from[name]}] : {var_dict[name]}')
  313. try:
  314. var_box.delete(0, tkinter.END)
  315. var_box.insert(0, *var)
  316. except TclError:
  317. pass
  318. queue_controller.init(update_var_box, update_queue_box)
  319. def to_website():
  320. SCREEN.update()
  321. t = threading.Thread(target=webbrowser.open, args=('https://cotan.songzh.website/',))
  322. t.start()
  323. def close():
  324. global SCREEN
  325. if not queue_controller.can_stop():
  326. tkinter.messagebox.showinfo('操作不被允许', '请先关闭其他模块。')
  327. else:
  328. SCREEN.destroy()
  329. def cotan_main():
  330. global SCREEN, title_color, button_color, button_cursor, img
  331. SCREEN = DragWindow(width=1200, height=800)
  332. font1 = tkfont.Font(family='Comic Sans MS', size=20, weight=tkfont.BOLD)
  333. font2 = tkfont.Font(family='Comic Sans MS', size=16, weight=tkfont.BOLD)
  334. font3 = tkfont.Font(family='Comic Sans MS', size=10)
  335. SCREEN.title('')
  336. SCREEN.resizable(width=False, height=False)
  337. SCREEN.geometry(f'1200x800+30+30')
  338. center_windows(SCREEN, 1200, 800)
  339. # 渲染白色
  340. frame = tkinter.Frame(SCREEN, width=1200, height=800, bg='#FFFFFF')
  341. frame.pack()
  342. # 图片
  343. canvas = tkinter.Canvas(
  344. frame,
  345. bd=0,
  346. width=1000,
  347. height=800,
  348. highlightthickness=0)
  349. pic = pic_list[int(str(time.time()).split()[0][-1])]
  350. bg_image = ImageTk.PhotoImage(Image.open(f'Pic{os.sep}{pic}'))
  351. canvas.create_image(400, 400, image=bg_image)
  352. canvas.grid(column=1, row=0, sticky=tkinter.S + tkinter.N, rowspan=20)
  353. SCREEN.iconbitmap(bitmap=f'Pic{os.sep}favicon.ico', default=f'Pic{os.sep}favicon.ico')
  354. # 标题
  355. tkinter.Label(
  356. frame,
  357. text='CoTan~科学计算系统',
  358. width=20,
  359. bg='#FFFFFF',
  360. font=font1).grid(
  361. column=0,
  362. row=0,
  363. sticky=tkinter.N) # 设置说明
  364. tkinter.Label(
  365. frame,
  366. text='CoTan工具',
  367. bg=title_color,
  368. font=font2).grid(
  369. column=0,
  370. row=1,
  371. sticky=tkinter.W +
  372. tkinter.E)
  373. tkinter.Button(
  374. frame,
  375. text='CoTan草稿板',
  376. cursor=button_cursor,
  377. height=2,
  378. font=font3,
  379. bg=button_color,
  380. command=draftboard_run,
  381. activebackground=title_color,
  382. bd=0,
  383. justify=tkinter.LEFT).grid(
  384. column=0,
  385. row=2,
  386. sticky=tkinter.N +
  387. tkinter.E +
  388. tkinter.W)
  389. tkinter.Button(
  390. frame,
  391. text='自动化网页',
  392. cursor=button_cursor,
  393. command=crawlef_run,
  394. height=2,
  395. font=font3,
  396. bg=button_color,
  397. activebackground=title_color,
  398. bd=0,
  399. justify=tkinter.LEFT).grid(
  400. column=0,
  401. row=3,
  402. sticky=tkinter.N +
  403. tkinter.E +
  404. tkinter.W)
  405. tkinter.Button(
  406. frame,
  407. text='Git仓库控制器',
  408. cursor=button_cursor,
  409. command=git_run,
  410. height=1,
  411. font=font3,
  412. bg=button_color,
  413. activebackground=title_color,
  414. bd=0,
  415. justify=tkinter.LEFT).grid(
  416. column=0,
  417. row=4,
  418. sticky=tkinter.N +
  419. tkinter.E +
  420. tkinter.W)
  421. tkinter.Button(
  422. frame,
  423. text='CoTan社区',
  424. cursor=button_cursor,
  425. command=to_website,
  426. height=1,
  427. font=font3,
  428. bg=button_color,
  429. activebackground=title_color,
  430. bd=0,
  431. justify=tkinter.LEFT).grid(
  432. column=0,
  433. row=5,
  434. sticky=tkinter.N +
  435. tkinter.E +
  436. tkinter.W)
  437. title_color = '#FFFAFA'
  438. tkinter.Label(
  439. frame,
  440. text='数学系统',
  441. bg=title_color,
  442. font=font2).grid(
  443. column=0,
  444. row=6,
  445. sticky=tkinter.W +
  446. tkinter.E)
  447. tkinter.Button(
  448. frame,
  449. text='代数工厂',
  450. cursor=button_cursor,
  451. command=algebraicfactory_run,
  452. height=2,
  453. font=font3,
  454. bg=button_color,
  455. activebackground=title_color,
  456. bd=0,
  457. justify=tkinter.LEFT).grid(
  458. column=0,
  459. row=7,
  460. sticky=tkinter.N +
  461. tkinter.E +
  462. tkinter.W)
  463. tkinter.Button(
  464. frame,
  465. text='机器学习',
  466. cursor=button_cursor,
  467. command=machinelearner_run,
  468. height=2,
  469. font=font3,
  470. bg=button_color,
  471. activebackground=title_color,
  472. bd=0,
  473. justify=tkinter.LEFT).grid(
  474. column=0,
  475. row=8,
  476. sticky=tkinter.N +
  477. tkinter.E +
  478. tkinter.W)
  479. tkinter.Button(
  480. frame,
  481. text='数据科学',
  482. cursor=button_cursor,
  483. command=datascience_run,
  484. height=2,
  485. font=font3,
  486. bg=button_color,
  487. activebackground=title_color,
  488. bd=0,
  489. justify=tkinter.LEFT).grid(
  490. column=0,
  491. row=9,
  492. sticky=tkinter.N +
  493. tkinter.E +
  494. tkinter.W)
  495. tkinter.Button(
  496. frame,
  497. text='函数工厂',
  498. cursor=button_cursor,
  499. command=functionfactory_run,
  500. height=1,
  501. font=font3,
  502. bg=button_color,
  503. activebackground=title_color,
  504. bd=0,
  505. justify=tkinter.LEFT).grid(
  506. column=0,
  507. row=10,
  508. sticky=tkinter.N +
  509. tkinter.E +
  510. tkinter.W)
  511. tkinter.Button(
  512. frame,
  513. text='函数实验室',
  514. cursor=button_cursor,
  515. command=functionmapping_run,
  516. height=1,
  517. font=font3,
  518. bg=button_color,
  519. activebackground=title_color,
  520. bd=0,
  521. justify=tkinter.LEFT).grid(
  522. column=0,
  523. row=11,
  524. sticky=tkinter.N +
  525. tkinter.E +
  526. tkinter.W)
  527. title_color = '#F5FFFA'
  528. tkinter.Label(
  529. frame,
  530. text='物化系统',
  531. bg=title_color,
  532. font=font2).grid(
  533. column=0,
  534. row=12,
  535. sticky=tkinter.W +
  536. tkinter.E)
  537. tkinter.Button(
  538. frame,
  539. text='几何车间',
  540. cursor=button_cursor,
  541. height=2,
  542. font=font3,
  543. bg=button_color,
  544. activebackground=title_color,
  545. bd=0,
  546. justify=tkinter.LEFT).grid(
  547. column=0,
  548. row=13,
  549. sticky=tkinter.N +
  550. tkinter.E +
  551. tkinter.W)
  552. tkinter.Button(
  553. frame,
  554. text='物理车间',
  555. cursor=button_cursor,
  556. height=2,
  557. font=font3,
  558. bg=button_color,
  559. activebackground=title_color,
  560. bd=0,
  561. justify=tkinter.LEFT).grid(
  562. column=0,
  563. row=14,
  564. sticky=tkinter.N +
  565. tkinter.E +
  566. tkinter.W)
  567. tkinter.Button(
  568. frame,
  569. text='化学车间',
  570. cursor=button_cursor,
  571. height=1,
  572. font=font3,
  573. bg=button_color,
  574. activebackground=title_color,
  575. bd=0,
  576. justify=tkinter.LEFT).grid(
  577. column=0,
  578. row=15,
  579. sticky=tkinter.N +
  580. tkinter.E +
  581. tkinter.W)
  582. tkinter.Button(
  583. frame,
  584. text='实验室管理',
  585. cursor=button_cursor,
  586. height=1,
  587. font=font3,
  588. bg=button_color,
  589. activebackground=title_color,
  590. bd=0,
  591. justify=tkinter.LEFT).grid(
  592. column=0,
  593. row=16,
  594. sticky=tkinter.N +
  595. tkinter.E +
  596. tkinter.W)
  597. title_color = '#F8F8FF'
  598. tkinter.Label(
  599. frame,
  600. text='其他工具',
  601. bg=title_color,
  602. font=font2).grid(
  603. column=0,
  604. row=17,
  605. sticky=tkinter.W +
  606. tkinter.E)
  607. tkinter.Button(
  608. frame,
  609. text='系统管理',
  610. cursor=button_cursor,
  611. command=system_run,
  612. height=1,
  613. font=font3,
  614. bg=button_color,
  615. activebackground=title_color,
  616. bd=0,
  617. justify=tkinter.LEFT).grid(
  618. column=0,
  619. row=18,
  620. sticky=tkinter.N +
  621. tkinter.E +
  622. tkinter.W)
  623. tkinter.Button(
  624. frame,
  625. text='通信管理器',
  626. cursor=button_cursor,
  627. height=1,
  628. font=font3,
  629. bg=button_color,
  630. command=queuer,
  631. activebackground=title_color,
  632. bd=0,
  633. justify=tkinter.LEFT).grid(
  634. column=0,
  635. row=19,
  636. sticky=tkinter.N +
  637. tkinter.E +
  638. tkinter.W)
  639. tkinter.Label(
  640. frame,
  641. text='',
  642. bg='#FFFFFF',
  643. font=font2,
  644. height=5).grid(
  645. column=0,
  646. row=20,
  647. sticky=tkinter.W +
  648. tkinter.E)
  649. # canvas.create_text(450, 740, text='Welcome to CoTan', font=font4, fill='#FFFFE0')
  650. SCREEN.protocol("WM_DELETE_WINDOW", close)
  651. SCREEN.mainloop()
  652. if __name__ == "__main__":
  653. freeze_support()
  654. cotan_main()