From 154657fd18f5b7a08ba8bba030cf74ba3620ab75 Mon Sep 17 00:00:00 2001 From: gitea Date: Sun, 9 Jun 2024 22:36:20 +0800 Subject: [PATCH] =?UTF-8?q?[modify]=20[aio.py]:=20=E4=BF=AE=E6=94=B9menu?= =?UTF-8?q?=5Fmain->menu=5Fmain=5Fdp=EF=BC=8Cmenu=5Fsub->menu=5Fsub=5Fdp?= =?UTF-8?q?=EF=BC=8C=E4=B8=BA=E5=90=8E=E7=BB=AD=E5=85=B6=E4=BB=96tab?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=8C=89=E9=92=AE=E5=81=9A=E6=89=A9=E5=B1=95?= =?UTF-8?q?=EF=BC=8C=E6=98=AF=E9=92=88=E5=AF=B9=E7=AC=AC=E4=B8=89=E7=82=B9?= =?UTF-8?q?=E5=81=9A=E5=87=BA=E7=9A=84=E7=9B=B8=E5=BA=94=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 6 ++++-- aio/aio.py | 28 ++++++++++++++-------------- aio/layout.xlsx | Bin 12096 -> 14379 bytes aio/vers | 2 +- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/aio/README.md b/aio/README.md index b7ed5b3..8898a95 100644 --- a/aio/README.md +++ b/aio/README.md @@ -185,9 +185,11 @@ v0.1.4(2024/06/06) v0.1.5(2024/06/12) 1. [aio.py]: 主界面切换不同功能时保持placehold一致 2. [brake.py]: 由于制动采集模板和内容的更改,适配了新的数据,更新了算法 -3. [layout.xlsx]: 添加了各个功能的流程图 +3. [aio.py]: 新增tabview组件,区分数据处理和自动化测试功能 4. [aio.py]: 重新调整界面配色 5. [aio.py]: 修改了write2textbox函数,定制化显示每一行的颜色,针对每一行可自定义输出内容颜色 6. [brake.py/iso.py/current.py]: 由于第 5 点的更改,同时修改了其他文件相关引用的部分 7. [aio.py]: 更改label/entry/optionmenu等控件的生成方式,使用循环实现,更加简洁和容易维护 -8. [aio.py]: 新增tabview组件,区分数据处理和自动化测试功能 \ No newline at end of file +8. [aio.py]: 修改customtkinter库中C:\Users\Administrator\AppData\Local\Programs\Python\Python312\Lib\site-packages\customtkinter\windows\widgets\ctk_tabview.py文件,参考https://github.com/TomSchimansky/CustomTkinter/issues/2296,实现修改tabview组件的字体大小 +9. [aio.py]: 修改menu_main->menu_main_dp,menu_sub->menu_sub_dp,为后续其他tab功能按钮做扩展,是针对第三点做出的相应调整 +10. [layout.xlsx]: 添加了各个功能的流程图 \ No newline at end of file diff --git a/aio/aio.py b/aio/aio.py index 3160a48..177969a 100644 --- a/aio/aio.py +++ b/aio/aio.py @@ -6,13 +6,13 @@ import customtkinter import brake, current, iso from time import time, strftime, localtime from urllib.request import urlopen -import socket +from socket import setdefaulttimeout customtkinter.set_appearance_mode("System") # Modes: "System" (standard), "Dark", "Light" customtkinter.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue" customtkinter.set_widget_scaling(1.1) # widget dimensions and text size customtkinter.set_window_scaling(1.1) # window geometry dimensions -socket.setdefaulttimeout(10) +setdefaulttimeout(10) # global vars btns = { 'start': {'btn': '', 'row': 1, 'text': '开始运行'}, @@ -82,11 +82,11 @@ class App(customtkinter.CTk): self.tabview.add("Data Process") self.tabview.add("Automatic Test") # create main menu - self.menu_main = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process'), values=["INIT", "brake", "current", "iso"], font=self.my_font, text_color='yellow', button_color='red', fg_color='green', command=self.func_main_callback) - self.menu_main.grid(row=1, column=1, sticky='we', padx=5, pady=5) - self.menu_main.set("Start Here!") + self.menu_main_dp = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process'), values=["INIT", "brake", "current", "iso"], font=self.my_font, text_color='yellow', button_color='red', fg_color='green', command=self.func_main_callback) + self.menu_main_dp.grid(row=1, column=1, sticky='we', padx=5, pady=5) + self.menu_main_dp.set("Start Here!") # create sub menu - self.menu_sub = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process')) + self.menu_sub_dp = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process')) # ===================================================================== # create widgits for widgit in widgits: @@ -140,7 +140,7 @@ class App(customtkinter.CTk): widgits[widgit]['label'].configure(text=f'{widgit.upper()}', text_color="black") widgits[widgit]['optionmenu'].configure(state='disabled') - self.menu_sub.grid_forget() + self.menu_sub_dp.grid_forget() self.textbox.delete(index1='1.0', index2='end') self.textbox.configure(state='disabled') @@ -156,10 +156,10 @@ class App(customtkinter.CTk): widgits[widgit]['label'].configure(text_color="red") widgits[widgit]['optionmenu'].configure(state='normal') elif func_name == 'current': - self.menu_sub = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process'), values=["max", "avg", "cycle"], font=self.my_font, button_color='red', fg_color='green', command=self.func_sub_callback) - self.menu_sub.grid(row=2, column=1, sticky='we', padx=5, pady=5) - self.menu_sub.set("--select--") - self.menu_sub.configure(text_color='yellow') + self.menu_sub_dp = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process'), values=["max", "avg", "cycle"], font=self.my_font, button_color='red', fg_color='green', command=self.func_sub_callback) + self.menu_sub_dp.grid(row=2, column=1, sticky='we', padx=5, pady=5) + self.menu_sub_dp.set("--select--") + self.menu_sub_dp.configure(text_color='yellow') for widgit in widgits: if widgit in ['path', 'rc', 'rc1', 'rc2', 'rc3', 'rc4', 'rc5', 'rc6']: @@ -176,7 +176,7 @@ class App(customtkinter.CTk): widgits[widgit]['entry'].configure(state='normal') else: self.initialization() - self.menu_main.set("Start Here!") + self.menu_main_dp.set("Start Here!") def func_sub_callback(self, func_name): if func_name == "max": @@ -237,7 +237,7 @@ class App(customtkinter.CTk): return True def check_param(self): - func_name = self.menu_main.get() + func_name = self.menu_main_dp.get() if func_name == 'brake': path = widgits['path']['entry'].get().strip() av = widgits['av']['entry'].get().strip('- ') @@ -270,7 +270,7 @@ class App(customtkinter.CTk): vel = widgits['vel']['optionmenu'].get() trq = widgits['trq']['optionmenu'].get() trqh = widgits['trqh']['optionmenu'].get() - sub = self.menu_sub.get() + sub = self.menu_sub_dp.get() c1 = exists(path) c2 = sub in ['max', 'avg', 'cycle'] diff --git a/aio/layout.xlsx b/aio/layout.xlsx index 476231a74729bc29c0cd7abc6a33206aa5953965..bd6d15ee078002d91e7bc39e38377fff02ce1aee 100644 GIT binary patch delta 7547 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 c0