转向从机型配置文件获取参数

This commit is contained in:
2025-01-14 14:14:33 +08:00
parent 137122947c
commit 0e67a2831c
25 changed files with 524877 additions and 203 deletions

View File

@@ -15,6 +15,7 @@ from datetime import datetime
import os
from common import clibs, openapi
from data_process import current, brake, iso, wavelogger
from automatic_test import do_current
import threading
import re
@@ -118,6 +119,7 @@ class App:
self.label_tips = ctk.CTkLabel(self.frame_status, textvariable=var_tips, compound="left", bg_color="#C9C9C9", font=self.f_status, anchor="e")
self.__auth_and_vercheck()
if local_vers == self.server_vers:
# if True:
image = ctk.CTkImage(Image.open(f"{clibs.PREFIX}/media/updated.png"), size=(16, 16))
var_tips.set(" 当前是最新版本,继续保持! ")
self.label_tips.configure(text_color="#0D8A3D", image=image)
@@ -207,6 +209,12 @@ class App:
clibs.running = False
raise Exception(desc)
@staticmethod
def __is_running(operation):
if clibs.running:
messagebox.showerror(title="处理中", message=f"有程序正在运行,需等待结束后,在执行{operation}操作!")
return
def __program_start(self):
def get_data_dp():
data = {
@@ -230,10 +238,11 @@ class App:
return data
def init_op():
self.__is_running("开始")
self.text_output.delete("1.0", ctk.END)
self.tabview_bottom.set("输出")
clibs.tl_prg = self.__toplevel_progress
if clibs.db_state != "readwrite":
self.text_output.delete("1.0", ctk.END)
clibs.cursor.close()
clibs.conn.close()
clibs.conn = self.conn
@@ -241,8 +250,6 @@ class App:
clibs.db_state = "readwrite"
self.btn_load.configure(fg_color="#979DA2")
self.__get_realtime_log()
clibs.tl_prg = self.__toplevel_progress
# TBD: something signifies status of program and terminate some thread ect.
def exec_function():
init_op()
@@ -250,15 +257,22 @@ class App:
if not clibs.running:
clibs.running = True
clibs.data_dp = get_data_dp()
eval(clibs.data_dp["_main"] + ".main()")
clibs.running = False
try:
eval(clibs.data_dp["_main"] + ".main()")
finally:
clibs.running = False
else:
messagebox.showinfo(title="进行中...", message="当前有程序正在运行!")
elif self.tabview_top.get() == "自动测试":
clibs.running = True
clibs.data_at = get_data_at()
eval(clibs.data_at["_main"] + ".main()")
clibs.running = False
if not clibs.running:
clibs.running = True
clibs.data_at = get_data_at()
try:
eval("do_" + clibs.data_at["_main"] + ".main()")
finally:
clibs.running = False
else:
messagebox.showinfo(title="进行中...", message="当前有程序正在运行!")
exec_function()
@@ -270,6 +284,8 @@ class App:
self.entry_path_atv.set("数据文件夹路径")
self.entry_path_atv.set("数据文件夹路径")
self.__is_running("重置")
if clibs.db_state == "readwrite":
res = messagebox.askyesno(title="状态重置", message="这将清空本次所有的输出以及日志记录,且不可恢复,请确认!", default=messagebox.NO, icon=messagebox.WARNING)
if res:
@@ -278,13 +294,14 @@ class App:
clibs.lock.acquire(True)
clibs.cursor.execute("delete from logs")
clibs.cursor.execute("delete from sqlite_sequence") # 主键归零
except Exception:
self.__w2t("主键归零操作失败", "red")
finally:
clibs.lock.release()
self.treeview_logs.delete(*self.treeview_logs.get_children())
self.label_pages_logs.set("-.-.-.-.-.-")
reset_methods()
# TBD: something signifies status of program and terminate some thread ect.
elif clibs.db_state == "readonly":
res = messagebox.askyesno(title="状态重置", message="这将清空本次所有的输出以及恢复本次的日志记录,请确认!", default=messagebox.NO, icon=messagebox.INFO)
if res:
@@ -296,12 +313,11 @@ class App:
clibs.db_state = "readwrite"
self.__get_realtime_log()
reset_methods()
# TBD: something signifies status of program and terminate some thread ect.
@clibs.db_lock
def __get_realtime_log(self):
clibs.cursor.execute("select id from logs")
len_records = len(clibs.cursor.fetchall())
clibs.cursor.execute("select count(id) from logs")
len_records = clibs.cursor.fetchone()[0]
pages_all = len_records // 100 if len_records % 100 == 0 else len_records // 100 + 1
self.label_pages_logs.set(f"{pages_all} / {pages_all}")
@@ -333,14 +349,14 @@ class App:
self.treeview_logs.delete(*self.treeview_logs.get_children())
for record in records:
self.treeview_logs.insert("", "end", values=record, tags=record[2])
# self.treeview_logs.yview_moveto(1)
self.treeview_logs.yview_moveto(0)
clibs.cursor.execute("select * from logs order by id desc")
records = clibs.cursor.fetchall()
pages_all = len(records) // 100 if len(records) % 100 == 0 else len(records) // 100 + 1
clibs.cursor.execute("select count(id) from logs")
len_records = clibs.cursor.fetchone()[0]
pages_all = len_records // 100 if len_records % 100 == 0 else len_records // 100 + 1
current_page = int(end) // 100 if int(end) % 100 == 0 else int(end) // 100 + 1
self.label_pages_logs.set(f"{current_page} / {pages_all}")
except Exception as ERR:
except Exception:
...
else:
pages_all = self.label_pages_logs.get().split("/")[1].strip()
@@ -354,6 +370,7 @@ class App:
if index_end <= 100:
for record in clibs.f_records[:index_end]:
self.treeview_logs.insert("", "end", values=record, tags=record[2])
self.treeview_logs.yview_moveto(0)
else:
for record in clibs.f_records[index_end-100:index_end]:
self.treeview_logs.insert("", "end", values=record, tags=record[2])
@@ -365,10 +382,9 @@ class App:
@clibs.db_lock
def get_next_page():
if self.btn_find.cget("fg_color") == "#979DA2":
# noinspection PyBroadException
try:
clibs.cursor.execute("select id from logs")
len_records = len(clibs.cursor.fetchall())
clibs.cursor.execute("select count(id) from logs")
len_records = clibs.cursor.fetchone()[0]
row = self.treeview_logs.get_children()
last_id = self.treeview_logs.item(row[-1], "values")[0]
@@ -380,18 +396,18 @@ class App:
self.treeview_logs.delete(*self.treeview_logs.get_children())
for record in records:
self.treeview_logs.insert("", "end", values=record, tags=record[2])
# self.treeview_logs.yview_moveto(1)
self.treeview_logs.yview_moveto(0)
pages_all = len_records // 100 if len_records % 100 == 0 else len_records // 100 + 1
current_page = int(start) // 100 if int(start) % 100 == 0 else int(start) // 100 + 1
self.label_pages_logs.set(f"{current_page} / {pages_all}")
except Exception as Err:
print(f"get_next_page-if: {Err}")
_pages_all = len_records // 100 if len_records % 100 == 0 else len_records // 100 + 1
_current_page = int(start) // 100 if int(start) % 100 == 0 else int(start) // 100 + 1
self.label_pages_logs.set(f"{_current_page} / {_pages_all}")
except Exception:
...
else:
len_records = len(clibs.f_records)
pages_all = int(self.label_pages_logs.get().split("/")[1].strip())
current_page = int(self.label_pages_logs.get().split("/")[0].strip())
if current_page < pages_all:
_pages_all = int(self.label_pages_logs.get().split("/")[1].strip())
_current_page = int(self.label_pages_logs.get().split("/")[0].strip())
if _current_page < _pages_all:
row = self.treeview_logs.get_children()
last_one = list(self.treeview_logs.item(row[-1], "values"))
last_one[0] = int(last_one[0])
@@ -400,12 +416,14 @@ class App:
if index_start+100 <= len_records:
for record in clibs.f_records[index_start:index_start+100]:
self.treeview_logs.insert("", "end", values=record, tags=record[2])
self.treeview_logs.yview_moveto(0)
else:
for record in clibs.f_records[index_start:]:
self.treeview_logs.insert("", "end", values=record, tags=record[2])
self.treeview_logs.yview_moveto(0)
next_page = current_page + 1
self.label_pages_logs.set(f"{next_page} / {pages_all}")
_next_page = _current_page + 1
self.label_pages_logs.set(f"{_next_page} / {_pages_all}")
current_page = int(self.label_pages_logs.get().split("/")[0].strip())
pages_all = int(self.label_pages_logs.get().split("/")[1].strip())
@@ -417,19 +435,24 @@ class App:
get_next_page()
def __load_log_db(self):
self.__is_running("加载")
db_file = filedialog.askopenfilename(title="加载数据库文件", defaultextension=".db", initialdir=f"{clibs.PREFIX}/logs")
if not db_file:
return
self.conn = clibs.conn
self.cursor = clibs.cursor
try:
clibs.conn = sqlite3.connect(f"file:{db_file}?mode=ro", uri=True, isolation_level=None, check_same_thread=False, cached_statements=256)
clibs.conn = sqlite3.connect(f"file:{db_file}?mode=ro", uri=True, isolation_level=None, check_same_thread=False, cached_statements=2048)
clibs.cursor = clibs.conn.cursor()
clibs.cursor.execute("PRAGMA synchronous=normal")
clibs.cursor.execute("PRAGMA temp_store=memory")
clibs.cursor.execute("PRAGMA mmap_size=30000000000")
clibs.cursor.execute("PRAGMA cache_size=200000")
clibs.db_state = "readonly"
self.__get_realtime_log()
self.btn_load.configure(fg_color="#000080")
except Exception as Err:
clibs.insert_logdb("ERROR", "aio", f"加载数据库失败,需确认 {db_file} 是否是有效数据库文件!")
clibs.insert_logdb("ERROR", "aio", f"load_log_db: 加载数据库失败,需确认 {db_file} 是否是有效数据库文件!\n{Err}")
messagebox.showerror(title="加载数据库失败", message=f"需确认 {db_file} 是否是有效数据库文件!")
def __main_switch_dp(self, event):
@@ -459,7 +482,7 @@ class App:
url_vers = "http://10.2.23.150:10008/version"
try:
self.server_vers = request.urlopen(url_vers, timeout=2).read().decode("utf-8").strip()
except Exception as Err:
except Exception:
messagebox.showwarning(title="退出", message="无法连接至服务器.....")
clibs.cursor.close()
clibs.conn.close()
@@ -543,7 +566,7 @@ class App:
index_start = all_text.find(selected)
index_end = index_start + len(selected)
widget.delete(index_start, index_end)
except Exception as Err:
except Exception:
...
@staticmethod
@@ -556,7 +579,7 @@ class App:
index_start = all_text.find(selected)
index_end = index_start + len(selected)
widget.delete(index_start, index_end)
except Exception as Err:
except Exception:
...
@staticmethod
@@ -565,7 +588,7 @@ class App:
widget.clipboard_clear()
copy_text = widget.selection_get()
widget.clipboard_append(copy_text)
except Exception as Err:
except Exception:
...
@staticmethod
@@ -601,7 +624,6 @@ class App:
widget_toplevel.destroy()
def double_click(event):
# noinspection PyBroadException
try:
e = event.widget
iid = e.identify("item", event.x, event.y)
@@ -616,7 +638,7 @@ class App:
toplevel.bind("<Escape>", esc_quit_log_tl)
toplevel.transient(self.root)
toplevel.focus()
_text = f"TS: {_ts} | Log level: {_level} | Module: {_module}"
_text = f"{_level} log in {_module} @ {_ts}"
label_info = ctk.CTkLabel(toplevel, text=_text, width=10, fg_color="#5F9EA0", corner_radius=5, font=self.f_treeview)
text_content = ctk.CTkTextbox(toplevel, width=10, font=self.f_toplevel)
text_content.insert(ctk.END, repr(_content))
@@ -638,19 +660,19 @@ class App:
if number > 0:
start = number * 100 - 99
end = number * 100
clibs.cursor.execute("select id from logs")
len_records = len(clibs.cursor.fetchall())
clibs.cursor.execute("select count(id) from logs")
len_records = clibs.cursor.fetchone()[0]
if start <= len_records:
clibs.cursor.execute(f"select * from logs where id between {start} and {end}")
records = clibs.cursor.fetchall()
self.treeview_logs.delete(*self.treeview_logs.get_children())
for record in records:
self.treeview_logs.insert("", "end", values=record, tags=record[2])
self.treeview_logs.yview_moveto(1)
self.treeview_logs.yview_moveto(0)
pages_all = len_records // 100 if len_records % 100 == 0 else len_records // 100 + 1
self.label_pages_logs.set(f"{number} / {pages_all}")
except Exception as Err:
except Exception:
...
def close_toplevel(tl):
@@ -861,22 +883,25 @@ class App:
if self.btn_conn.cget("fg_color") == "#979DA2":
self.btn_conn.configure(state="disabled")
clibs.ip_addr = self.entry_ip_atv.get().strip()
ip_pattern = re.compile(r'(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])')
ip_pattern = re.compile(r"(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])")
if not ip_pattern.fullmatch(clibs.ip_addr):
messagebox.showerror(title="非法地址", message=f"{clibs.ip_addr} 不是一个有效的 IP 地址")
clibs.insert_logdb("ERROR", "aio", f"connection: {clibs.ip_addr} 不是一个有效的 IP 地址")
return
try:
# clibs.c_md = openapi.ModbusRequest(clibs.ip_addr, clibs.modbus_port)
clibs.c_md = openapi.ModbusRequest(clibs.ip_addr, clibs.modbus_port)
clibs.c_hr = openapi.HmiRequest(clibs.ip_addr, clibs.socket_port, clibs.xService_port)
clibs.c_pd = openapi.PreDos(clibs.ip_addr, clibs.ssh_port, clibs.username, clibs.password)
self.btn_conn.configure(state="normal", fg_color="#2E8B57")
except Exception as Err:
except Exception:
self.btn_conn.configure(state="normal", fg_color="#979DA2")
elif self.btn_conn.cget("fg_color") == "#2E8B57":
self.btn_conn.configure(state="disabled")
try:
# clibs.c_md.close()
clibs.c_md.close()
clibs.c_hr.close()
except Exception:
...
finally:
self.btn_conn.configure(state="normal", fg_color="#979DA2")
t = threading.Thread(target=conn_or_disconn)
@@ -989,10 +1014,11 @@ class App:
self.om_sensor_dp.configure(state="disabled")
# ========================================================================
clibs.w2t = self.__w2t
# clibs.insert_logdb("INFO", "aio", "AIO starts running......")
clibs.insert_logdb("INFO", "aio", "AIO starts running......")
def show(self):
if self.server_vers:
# if True:
t = threading.Thread(target=self.__detect_network)
t.daemon = True
t.start()