Browse Source

update README.md

Huan 5 years ago
parent
commit
c211ab115d
2 changed files with 144 additions and 480 deletions
  1. 119 459
      Hello.py
  2. 25 21
      README.md

+ 119 - 459
Hello.py

@@ -1,35 +1,70 @@
 from multiprocessing import Process, Queue, freeze_support
 import threading
-from _tkinter import TclError
-import tkinter
-from tkinter import ttk
-import tkinter.font as tkfont
-from PIL import ImageTk, Image
 import time
 import os
-import tkinter.messagebox
 import webbrowser
 import random
+import flask
+import json
 
 from newtkinter import DragWindow, center_windows
 
-img = None
-SCREEN = None
-queue_screen = None
-draftboard_start = None
-datascience_start = None
-functionmapping_start = None
-functionfactory_start = None
-algebraicfactory_start = None
-machinelearner_start = None
-git_start = None
-crawlef_start = None
-title_color = '#F0FFFF'
-button_color = '#FFFFFF'
-button_cursor = 'tcross'
-pic_list = os.listdir(f'{os.getcwd()}{os.sep}Pic')
+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:
@@ -84,6 +119,7 @@ class QueueController:
 
     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())
@@ -122,55 +158,19 @@ class QueueController:
 
 
 queue_controller = QueueController()
+queue_controller.init(update_var_box, update_queue_box)
 
 
 def progress_bar(func):
-    def make_bar(*agrs, **kwargs):
-        SCREEN.update()
-        in_queue: Queue
-        out_queue: Queue
+    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}')
-        progress_screen = tkinter.Toplevel()
-        progress_screen.title('系统持续加载中...')
-        progress_screen.geometry("+10+10")  # 设置所在位置
-        progress = ttk.Progressbar(
-            progress_screen, orient="horizontal", length=300, mode="determinate"
-        )
-        progress.pack()
-        progress_screen.resizable(width=False, height=False)
-        progress["maximum"] = 10
-        progress["value"] = 0
-        i = 0
-        a = 10
-        while out_queue.empty():
-            i += 1
-            a += 1
-            try:
-                progress["value"] = i
-                progress["maximum"] = a
-                progress_screen.update()
-            except TclError:
-                pass
-            SCREEN.update()
-            time.sleep(0.015)
-        try:
-            out_queue.get()
-            t = 0.3
-            for di in range(10):
-                t -= 0.03
-                progress_screen.title(f'检查({round(t,3)})...')
-                progress["value"] = i + di
-                progress_screen.update()
-                time.sleep(0.03)
-            progress_screen.destroy()
-        except TclError:
-            pass
         queue_controller()
-
-    return make_bar
+        time.sleep(1)
+        return 'run success'
+    return run
 
 
 def draftboard_main(in_queue, out_queue):
@@ -181,6 +181,21 @@ def draftboard_main(in_queue, out_queue):
     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)
@@ -197,6 +212,11 @@ def datascience_main(in_queue, out_queue):
     machine_learning(in_queue, out_queue)
 
 
+@app.route('/datascience')
+def datascience():
+    return datascience_run()
+
+
 @progress_bar
 def datascience_run():
     in_queue = Queue(10)
@@ -213,6 +233,11 @@ def functionmapping_main(in_queue, out_queue):
     function_mapping(in_queue, out_queue)
 
 
+@app.route('/functionmapping')
+def functionmapping():
+    return functionmapping_run()
+
+
 @progress_bar
 def functionmapping_run():
     in_queue = Queue(10)
@@ -229,6 +254,11 @@ def functionfactory_main(in_queue, out_queue):
     function_factory_main(in_queue, out_queue)
 
 
+@app.route('/functionfactory')
+def functionfactory():
+    return functionfactory_run()
+
+
 @progress_bar
 def functionfactory_run():
     in_queue = Queue(10)
@@ -245,6 +275,11 @@ def algebraicfactory_main(in_queue, out_queue):
     algebraic_factory_main(in_queue, out_queue)
 
 
+@app.route('/algebraicfactory')
+def algebraicfactory():
+    return algebraicfactory_run()
+
+
 @progress_bar
 def algebraicfactory_run():
     in_queue = Queue(10)
@@ -261,6 +296,11 @@ def machinelearner_main(in_queue, out_queue):
     machine_learning(in_queue, out_queue)
 
 
+@app.route('/machinelearner')
+def machinelearner():
+    return machinelearner_run()
+
+
 @progress_bar
 def machinelearner_run():
     in_queue = Queue(10)
@@ -277,6 +317,11 @@ def git_main(in_queue, out_queue):
     git_main(in_queue, out_queue)
 
 
+@app.route('/git')
+def git():
+    return git_run()
+
+
 @progress_bar
 def git_run():
     in_queue = Queue(10)
@@ -293,8 +338,13 @@ def crawler_main(in_queue, out_queue):
     crawler_main(in_queue, out_queue)
 
 
+@app.route('/crawler')
+def crawler():
+    return crawler_run()
+
+
 @progress_bar
-def crawlef_run():
+def crawler_run():
     in_queue = Queue(10)
     out_queue = Queue(10)
     Process(target=crawler_main, args=(in_queue, out_queue)).start()
@@ -309,6 +359,11 @@ def system_main(in_queue, out_queue):
     system_main(in_queue, out_queue)
 
 
+@app.route('/system')
+def system():
+    return system_run()
+
+
 @progress_bar
 def system_run():  # 不需要进度条
     in_queue = Queue(10)
@@ -317,406 +372,11 @@ def system_run():  # 不需要进度条
     return in_queue, out_queue
 
 
-def queuer():
-    global title_color, button_color, button_cursor, queue_screen
-    try:
-        queue_screen.destroy()
-    except (AttributeError, TclError):
-        pass
-    queue_screen = tkinter.Toplevel()
-
-    queue_screen.title('通信管理器')
-    queue_screen.resizable(width=False, height=False)
-    queue_screen.geometry(f'+30+30')
-    font = ("黑体", 11)  # 设置字体
-
-    def sent():
-        nonlocal sent_text, queue_box
-        value = sent_text.get()
-        try:
-            index = queue_box.curselection()[0]
-        except IndexError:
-            return
-        queue_controller.put(value, index)
-
-    width_b = 20
-    height_b = 2
-    a_x = 0
-    a_y = 0
-    sent_text = tkinter.Entry(queue_screen, width=width_b * 2)
-    sent_text.grid(column=a_x, row=a_y, columnspan=2, sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N)
-    tkinter.Button(queue_screen, bg=button_color, text='发送', command=sent, font=font, width=10, height=height_b)\
-        .grid(column=a_x+2, row=a_y, sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N)
-    a_y += 1
-    queue_box = tkinter.Listbox(queue_screen, height=height_b * 8)
-    queue_box.grid(column=a_x, row=a_y, columnspan=3, rowspan=8, sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N)
-    a_x += 3
-    a_y = 0
-    var_box = tkinter.Listbox(queue_screen, width=width_b * 3, height=height_b * 9)
-    var_box.grid(column=a_x, row=a_y, columnspan=3, rowspan=9, sticky=tkinter.E + tkinter.W + tkinter.S + tkinter.N)
-
-    def update_queue_box(queue_list):
-        try:
-            queue_box.delete(0, tkinter.END)
-            queue_box.insert(0, *queue_list)
-        except TclError:
-            pass
-
-    def update_var_box(var_dict, var_from):
-        var = []
-        for name in var_dict:
-            var.append(f'{name}[{var_from[name]}] : {var_dict[name]}')
-        try:
-            var_box.delete(0, tkinter.END)
-            var_box.insert(0, *var)
-        except TclError:
-            pass
-
-    queue_controller.init(update_var_box, update_queue_box)
-
-
 def to_website():
-    SCREEN.update()
     t = threading.Thread(target=webbrowser.open, args=('https://cotan.songzh.website/',))
     t.start()
 
 
-def close():
-    global SCREEN
-    if not queue_controller.can_stop():
-        tkinter.messagebox.showinfo('操作不被允许', '请先关闭其他模块。')
-    else:
-        SCREEN.destroy()
-
-
-def cotan_main():
-    global SCREEN, title_color, button_color, button_cursor, img
-    SCREEN = DragWindow(width=1200, height=800)
-    font1 = tkfont.Font(family='Comic Sans MS', size=20, weight=tkfont.BOLD)
-    font2 = tkfont.Font(family='Comic Sans MS', size=16, weight=tkfont.BOLD)
-    font3 = tkfont.Font(family='Comic Sans MS', size=10)
-    SCREEN.title('')
-    SCREEN.resizable(width=False, height=False)
-    SCREEN.geometry(f'1200x800+30+30')
-    center_windows(SCREEN, 1200, 800)
-    # 渲染白色
-    frame = tkinter.Frame(SCREEN, width=1200, height=800, bg='#FFFFFF')
-    frame.pack()
-
-    # 图片
-    canvas = tkinter.Canvas(
-        frame,
-        bd=0,
-        width=1000,
-        height=800,
-        highlightthickness=0)
-    pic = pic_list[int(str(time.time()).split()[0][-1])]
-    bg_image = ImageTk.PhotoImage(Image.open(f'Pic{os.sep}{pic}'))
-    canvas.create_image(400, 400, image=bg_image)
-    canvas.grid(column=1, row=0, sticky=tkinter.S + tkinter.N, rowspan=20)
-    SCREEN.iconbitmap(bitmap=f'Pic{os.sep}favicon.ico', default=f'Pic{os.sep}favicon.ico')
-    # 标题
-    tkinter.Label(
-        frame,
-        text='CoTan~科学计算系统',
-        width=20,
-        bg='#FFFFFF',
-        font=font1).grid(
-        column=0,
-        row=0,
-        sticky=tkinter.N)  # 设置说明
-    tkinter.Label(
-        frame,
-        text='CoTan工具',
-        bg=title_color,
-        font=font2).grid(
-        column=0,
-        row=1,
-        sticky=tkinter.W +
-        tkinter.E)
-    tkinter.Button(
-        frame,
-        text='CoTan草稿板',
-        cursor=button_cursor,
-        height=2,
-        font=font3,
-        bg=button_color,
-        command=draftboard_run,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=2,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='自动化网页',
-        cursor=button_cursor,
-        command=crawlef_run,
-        height=2,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=3,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='Git仓库控制器',
-        cursor=button_cursor,
-        command=git_run,
-        height=1,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=4,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='CoTan社区',
-        cursor=button_cursor,
-        command=to_website,
-        height=1,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=5,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-
-    title_color = '#FFFAFA'
-    tkinter.Label(
-        frame,
-        text='数学系统',
-        bg=title_color,
-        font=font2).grid(
-        column=0,
-        row=6,
-        sticky=tkinter.W +
-        tkinter.E)
-    tkinter.Button(
-        frame,
-        text='代数工厂',
-        cursor=button_cursor,
-        command=algebraicfactory_run,
-        height=2,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=7,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='机器学习',
-        cursor=button_cursor,
-        command=machinelearner_run,
-        height=2,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=8,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='数据科学',
-        cursor=button_cursor,
-        command=datascience_run,
-        height=2,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=9,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='函数工厂',
-        cursor=button_cursor,
-        command=functionfactory_run,
-        height=1,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=10,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='函数实验室',
-        cursor=button_cursor,
-        command=functionmapping_run,
-        height=1,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=11,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-
-    title_color = '#F5FFFA'
-    tkinter.Label(
-        frame,
-        text='物化系统',
-        bg=title_color,
-        font=font2).grid(
-        column=0,
-        row=12,
-        sticky=tkinter.W +
-        tkinter.E)
-    tkinter.Button(
-        frame,
-        text='几何车间',
-        cursor=button_cursor,
-        height=2,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=13,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='物理车间',
-        cursor=button_cursor,
-        height=2,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=14,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='化学车间',
-        cursor=button_cursor,
-        height=1,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=15,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='实验室管理',
-        cursor=button_cursor,
-        height=1,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=16,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    title_color = '#F8F8FF'
-    tkinter.Label(
-        frame,
-        text='其他工具',
-        bg=title_color,
-        font=font2).grid(
-        column=0,
-        row=17,
-        sticky=tkinter.W +
-        tkinter.E)
-    tkinter.Button(
-        frame,
-        text='系统管理',
-        cursor=button_cursor,
-        command=system_run,
-        height=1,
-        font=font3,
-        bg=button_color,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=18,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Button(
-        frame,
-        text='通信管理器',
-        cursor=button_cursor,
-        height=1,
-        font=font3,
-        bg=button_color,
-        command=queuer,
-        activebackground=title_color,
-        bd=0,
-        justify=tkinter.LEFT).grid(
-        column=0,
-        row=19,
-        sticky=tkinter.N +
-        tkinter.E +
-        tkinter.W)
-    tkinter.Label(
-        frame,
-        text='',
-        bg='#FFFFFF',
-        font=font2,
-        height=5).grid(
-        column=0,
-        row=20,
-        sticky=tkinter.W +
-        tkinter.E)
-    # canvas.create_text(450, 740, text='Welcome to CoTan', font=font4, fill='#FFFFE0')
-    SCREEN.protocol("WM_DELETE_WINDOW", close)
-    SCREEN.mainloop()
-
-
 if __name__ == "__main__":
     freeze_support()
-    cotan_main()
+    app.run()

+ 25 - 21
README.md

@@ -5,27 +5,29 @@ CoTan是基于python3x的一款用于数据科学等多方面的数理化系统
 可以用于数据处理、数学运算、物理分析等场景。
 
 ### CoTan具有什么功能?
-* 初等数学的代数运算,如:解线性方程、函数绘制、函数求解等
-* 数据处理,如:特征工程、曲线拟合、机器学习以及数据可视化等
-* 基于git的数据管理可视化系统
-* 自动化网页控制系统、爬虫系统
+* 快速草稿版,如:快速绘制坐标系、快速标注、快速绘制函数
+* 自动化网页系统,如:自动化网页测试、网络爬虫
+* 可视化git控制器,快速管理git仓库
+* 初等数学的代数运算,如:解线性方程、函数求解等
+* 函数系统(代数模块子模块),如:函数绘制,函数动态绘制,多函数比较等
+* 数据处理,如:特征工程、数据可视化
+* 机器学习,如:模型构建、模型数据可视化、特征数据可视化、矩阵运算
+* 笔记本功能(社区) **部分已实现**
 * 物理仿真,如:受力分析,运动分析等 **未来实现**
 * 化学反应推理,如:反应计算,反应方程配平,反应机理预测 **未来实现**
 * 实验室管理系统,如:人员登记、药品登记等 **未来实现**
 * 数学几何分析,如:几何证明,几何约束 **未来实现**
-* 笔记本功能(社区) **部分已实现**
 
 ### 为什么选择CoTan?
-* 深度与Python结合,支持计算方式自定义(如:自定义函数判断规则)
-* 轻便不笨重,CoTan比其他科学计算系统更轻便
-* 功能实用,CoTan功能虽不比其他科学计算系统强大,但实用且灵活
-* 可扩展性高,用户可以用重写类的方式制作扩展,CoTan提供了扩展使用助手  
-* 可直接用Python代码与系统进行交互,CoTan提供了灵活的进程交互助手
+* 深度与Python结合,可以用Python代码以插件的形式重写方法
+* 各模块为独立的进程,并且可以使用Python代码于其直接交互
+* 轻便不笨重,CoTan比其他科学计算系统更轻便,下一步CoTan将会尝试把GUI移植到HTML
+* 功能实用,CoTan功能丰富易用,容易上手
 * CoTan将会是一个开源项目
 
 ### 如何使用CoTan?
-CoTan的主程序入口时Hello.py,建议使用**Python3.7.5**版本运行该程序。  
-你可能需要通过**pip**或其他方式安装以下模块才可以正常使用:
+CoTan的主程序入口时```Hello.py```,建议使用```Python3.7.5```版本运行该程序。  
+你可能需要通过```pip```或其他方式安装以下模块才可以正常使用:
 ```
 Pillow==7.0.0
 pygame==1.9.6
@@ -44,27 +46,29 @@ pyecharts==1.7.0
 sklearn(sciket-learn==0.22.2.post1)==0.0
 pip==20.0.2
 ```
-进入程序后,将会出现**CoTan~别来无恙**的字样,表示系统启动成功。  
 主页面左侧为功能按钮,目前实现的有:  
-* Git仓库控制器:基于git的可视化仓库管理器,可以管理git仓库  
-* 画图板:方便的画图系统,可以绘制函数等几何图形  
-* 函数测绘:多函数并列对比、求值、绘图  
-* 函数工厂:针对函数测绘功能升级,针对单一函数展开研究  
+* CoTan草稿板:方便的画图系统,可以绘制函数等几何图形 
+* 自动化网页:自动化网页测试、网络爬虫 
+* Git仓库控制器:基于git的可视化仓库管理器,可以管理git仓库 
 * 代数工厂:带数计算系统,支持符号运算,可定义未知数等求解线性方程
 * 数据科学:可用于处理表格数据,如数据清洗和数据可视化
 * 机器学习:提供常用机器学习算法,针对每一套算法有专门的可视化方式,并由简单的矩阵运算
+* 函数实验室:多函数并列对比、求值、绘图  
+* 函数工厂:针对函数测绘功能升级,针对单一函数展开研究  
+* 系统管理:查询CoTan日志、安装和使用插件  
+* 通信管理器:模块间通信管理、可用python直接与其交互
 
 ### CoTan的下一步计划
-CoTan的下一步开发计划是:实现爬虫模块  
-该模块包含:URL管理单元、页面下载单元、页面解析单元、信息输出其单元  
+把CoTan的GUI重写为HTML,支持线上和本地部署,提供灵活的GUI界面
 
 ### 帮助CoTan的开发
-CoTan目前处于核心成员开发阶段,暂不对外公布
+CoTan开发团队接受并感谢:提交BUG、提交建议、提交代码、提交插件等帮助
 
 ### 关于CoTan
 
 #### 帮助文档
 * 目前,CoTan的帮助文档仍不详细,这一现状将会在以后得到改善
+
 #### CoTan LOGO
 ![LOGO](http://47.91.138.150/logo.jpg)
 
@@ -79,4 +83,4 @@ CoTan目前处于核心成员开发阶段,暂不对外公布
 * 感谢匿名帮助
   
 #### 最后编辑时间
-* 2020年3月19日 广州
+* 2020年3月22日 广州