123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382 |
- from multiprocessing import Process, Queue, freeze_support
- import threading
- import time
- import os
- import webbrowser
- import random
- import flask
- import json
- from newtkinter import DragWindow, center_windows
- app = flask.Flask(__name__, static_url_path='')
- pic_list = os.listdir(f'{os.getcwd()}{os.sep}static{os.sep}Pic')
- del pic_list[pic_list.index('favicon.ico')]
- pic_list = random.sample(pic_list, 10)
- queue_box = []
- var_box = []
- new_queue_box = True
- new_var_box = True
- @app.route('/img', methods=['get'])
- def get_img():
- pic = pic_list[int(str(time.time())[-1])]
- print(pic)
- return pic
- @app.route('/sent', methods=['get'])
- def sent():
- value = flask.request.args.get("message", '')
- index = queue_box.index(flask.request.args.get("index", queue_box[0]))
- queue_controller.put(value, index)
- return 'success'
- @app.route('/update')
- def update():
- global new_queue_box, new_var_box
- must = flask.request.args.get("must", 'NO')
- if must == 'must':
- new_queue_box = True
- new_var_box = True
- repo = {'queue': queue_box, 'var': var_box}
- if new_queue_box or new_var_box:
- repo['status'] = 'YES'
- else:
- repo['status'] = "NO"
- new_queue_box = False
- new_var_box = False
- return repo
- def update_queue_box(queue_list):
- global queue_box, new_queue_box
- queue_box = queue_list
- new_queue_box = True
- def update_var_box(var_dict, var_from):
- global var_box, new_var_box
- var = []
- for name in var_dict:
- var.append(f'{name}[{var_from[name]}] : {var_dict[name]}')
- var_box = var
- new_var_box = True
- class QueueController:
- def __init__(self):
- self.in_dict = {}
- self.out_dict = {}
- self.var_dict = {}
- self.queue_list = []
- self.var_from = {}
- self.update_var = lambda x, y: None
- self.update_queue = lambda x: None
- self.run = False
- self.stop_str = "__--$$stop_process$$--__"
- def can_stop(self):
- return len(self.out_dict) == 0
- def __call__(self, *args, **kwargs):
- self.run = True
- def done():
- while self.run:
- stop_pid = []
- old_var = list(self.var_dict.keys())
- for out in self.out_dict:
- output: Queue = self.out_dict[out]
- if output.empty():
- continue
- dict_index = f'var_{len(self.var_dict)}'
- get_out = output.get()
- if get_out == self.stop_str:
- stop_pid.append(out)
- else:
- self.var_dict[dict_index] = get_out
- self.var_from[dict_index] = out
- if old_var != list(self.var_dict.keys()):
- self.update_var(self.var_dict, self.var_from)
- if stop_pid:
- for i in stop_pid:
- del self.in_dict[i]
- del self.out_dict[i]
- self.queue_list = list(self.in_dict.keys())
- self.update_queue(self.queue_list.copy())
- t = threading.Thread(target=done)
- t.setDaemon(True)
- t.start()
- return self
- def stop(self):
- self.run = False
- def add_queue(self, inqueue, outqueue, name):
- self.stop()
- time.sleep(0.5)
- self.in_dict[name] = inqueue
- self.out_dict[name] = outqueue
- self.queue_list = list(self.in_dict.keys())
- self.update_queue(self.queue_list.copy())
- self.update_var(self.var_dict, self.var_from)
- def init(self, update_var, update_queue):
- self.update_var = update_var
- self.update_queue = update_queue
- self.update_queue(list(self.in_dict.keys()))
- self.update_var(self.var_dict, self.var_from)
- def put(self, value: str, index):
- name_space = self.var_dict.copy()
- name_space.update(globals())
- in_queue = self.in_dict[self.queue_list[index]]
- if value.startswith('put_var '):
- var_name = value[7:]
- in_queue.put(self.var_dict.get(var_name))
- elif value.startswith('put_eval '):
- in_queue.put(eval(value[8:]), name_space)
- elif value.startswith('put_file ') and value.startswith('.py'):
- try:
- with open(value[4:], 'r') as f:
- code_file = f.read()
- new_name_space = name_space
- exec(code_file, new_name_space)
- dict_index = f'var_{len(self.var_dict)}'
- in_queue.put(list(new_name_space.keys()))
- self.var_dict[dict_index] = new_name_space.copy()
- self.var_from[dict_index] = 'self'
- except BaseException as e:
- in_queue.put(str(e))
- else:
- in_queue.put(value)
- queue_controller = QueueController()
- queue_controller.init(update_var_box, update_queue_box)
- def progress_bar(func):
- def run(*agrs, **kwargs):
- in_queue, out_queue = func(*agrs, **kwargs)
- pid = out_queue.get()
- name = func.__name__
- queue_controller.add_queue(in_queue, out_queue, f'{name}_{pid}')
- queue_controller()
- time.sleep(1)
- return 'run success'
- return run
- def draftboard_main(in_queue, out_queue):
- out_queue.put(str(os.getpid()))
- from draftboard import draw_main
- out_queue.put('start')
- # 不需要等待
- draw_main(in_queue, out_queue)
- @app.route('/communication')
- def communication():
- return app.send_static_file(r'Communication.html')
- @app.route('/')
- def hello():
- return app.send_static_file('Hello.html')
- @app.route('/draftboard')
- def draftboard():
- return draftboard_run()
- @progress_bar
- def draftboard_run():
- in_queue = Queue(10)
- out_queue = Queue(10)
- Process(target=draftboard_main, args=(in_queue, out_queue)).start()
- return in_queue, out_queue
- def datascience_main(in_queue, out_queue):
- out_queue.put(str(os.getpid()))
- from datascience import machine_learning
- out_queue.put('start')
- time.sleep(0.5)
- machine_learning(in_queue, out_queue)
- @app.route('/datascience')
- def datascience():
- return datascience_run()
- @progress_bar
- def datascience_run():
- in_queue = Queue(10)
- out_queue = Queue(10)
- Process(target=datascience_main, args=(in_queue, out_queue)).start()
- return in_queue, out_queue
- def functionmapping_main(in_queue, out_queue):
- out_queue.put(str(os.getpid()))
- from funcsystem.map import function_mapping
- out_queue.put('start')
- time.sleep(0.5)
- function_mapping(in_queue, out_queue)
- @app.route('/functionmapping')
- def functionmapping():
- return functionmapping_run()
- @progress_bar
- def functionmapping_run():
- in_queue = Queue(10)
- out_queue = Queue(10)
- Process(target=functionmapping_main, args=(in_queue, out_queue)).start()
- return in_queue, out_queue
- def functionfactory_main(in_queue, out_queue):
- out_queue.put(str(os.getpid()))
- from funcsystem.factory import function_factory_main
- out_queue.put('start')
- time.sleep(0.5)
- function_factory_main(in_queue, out_queue)
- @app.route('/functionfactory')
- def functionfactory():
- return functionfactory_run()
- @progress_bar
- def functionfactory_run():
- in_queue = Queue(10)
- out_queue = Queue(10)
- Process(target=functionfactory_main, args=(in_queue, out_queue)).start()
- return in_queue, out_queue
- def algebraicfactory_main(in_queue, out_queue):
- out_queue.put(str(os.getpid()))
- from algebraicfactory import algebraic_factory_main
- out_queue.put('start')
- time.sleep(0.5)
- algebraic_factory_main(in_queue, out_queue)
- @app.route('/algebraicfactory')
- def algebraicfactory():
- return algebraicfactory_run()
- @progress_bar
- def algebraicfactory_run():
- in_queue = Queue(10)
- out_queue = Queue(10)
- Process(target=algebraicfactory_main, args=(in_queue, out_queue)).start()
- return in_queue, out_queue
- def machinelearner_main(in_queue, out_queue):
- out_queue.put(str(os.getpid()))
- from machinelearning import machine_learning
- out_queue.put('start')
- time.sleep(0.5)
- machine_learning(in_queue, out_queue)
- @app.route('/machinelearner')
- def machinelearner():
- return machinelearner_run()
- @progress_bar
- def machinelearner_run():
- in_queue = Queue(10)
- out_queue = Queue(10)
- Process(target=machinelearner_main, args=(in_queue, out_queue)).start()
- return in_queue, out_queue
- def git_main(in_queue, out_queue):
- out_queue.put(str(os.getpid()))
- from gitrepo import git_main
- out_queue.put('start')
- time.sleep(0.5)
- git_main(in_queue, out_queue)
- @app.route('/git')
- def git():
- return git_run()
- @progress_bar
- def git_run():
- in_queue = Queue(10)
- out_queue = Queue(10)
- Process(target=git_main, args=(in_queue, out_queue)).start()
- return in_queue, out_queue
- def crawler_main(in_queue, out_queue):
- out_queue.put(str(os.getpid()))
- from crawler import crawler_main
- out_queue.put('start')
- time.sleep(0.5)
- crawler_main(in_queue, out_queue)
- @app.route('/crawler')
- def crawler():
- return crawler_run()
- @progress_bar
- def crawler_run():
- in_queue = Queue(10)
- out_queue = Queue(10)
- Process(target=crawler_main, args=(in_queue, out_queue)).start()
- return in_queue, out_queue
- def system_main(in_queue, out_queue):
- out_queue.put(str(os.getpid()))
- from system.gui import system_main
- out_queue.put('start')
- time.sleep(0.5)
- system_main(in_queue, out_queue)
- @app.route('/system')
- def system():
- return system_run()
- @progress_bar
- def system_run(): # 不需要进度条
- in_queue = Queue(10)
- out_queue = Queue(10)
- Process(target=system_main, args=(in_queue, out_queue)).start()
- return in_queue, out_queue
- def to_website():
- t = threading.Thread(target=webbrowser.open, args=('https://cotan.songzh.website/',))
- t.start()
- if __name__ == "__main__":
- freeze_support()
- app.run()
|