feat: 增加 ZMQ 调试服务器并完善设置功能

This commit is contained in:
2026-04-20 06:37:46 +08:00
parent 85925b9d44
commit 709e15663b
11 changed files with 289 additions and 58 deletions

View File

@@ -1,6 +1,9 @@
from heurams.interface import *
from heurams.context import config_var
from heurams.services.logger import get_logger
import threading
import zmq
import pickle
logger = get_logger(__name__)
@@ -20,9 +23,43 @@ def environment_check():
print(f"找到 {i}")
logger.debug("环境检查完成")
def start_debug_server(app):
logger = get_logger("zmq_debug")
context = zmq.Context()
socket = context.socket(zmq.REP)
port = config_var.get()['global'].get('zmq_debug_port', 5555)
socket.bind(f"tcp://*:{port}")
logger.info(f"ZMQ Debug server started on port {port}")
first = 1
while True:
msg = socket.recv()
code = pickle.loads(msg)
namespace = {"app": app, "logger": logger, "config_var": config_var}
if first:
app.title += ' [调试已连接]'
first = 0
try:
# 先尝试 eval
result = eval(code, namespace)
socket.send(pickle.dumps(f"成功: {result}"))
except SyntaxError:
# 再尝试 exec
try:
exec(code, namespace)
socket.send(pickle.dumps(f"成功: 执行完成"))
except Exception as e:
socket.send(pickle.dumps(f"错误: {e}"))
except Exception as e:
socket.send(pickle.dumps(f"错误: {e}"))
def main():
environment_check()
app = HeurAMSApp()
if config_var.get()['global'].get('zmq_debug', False):
threading.Thread(target=start_debug_server, args=(app,), daemon=True).start()
app.run(inline=False)
if __name__ == "__main__":

View File

@@ -75,17 +75,17 @@ class SettingScreen(Screen):
a = self._get_subcfg(f"{parent_epath}.{i}")
if a:
lst.append(Collapsible(*a, title=i + f'\n{parent.get(f"_{i}_desc", "")}'))
elif f'_{i}_candidate' in parent:
elif f'_{i}_candidate' in parent: # 选择框模式
if isinstance(parent[f'_{i}_candidate'], dict):
lst.append(Horizontal(
Label(i + f'\n{parent.get(f"_{i}_desc", "")}'),
Select((f"{j} ({k})", j) for j, k in parent[f'_{i}_candidate'].items()),
Select(((f"{j} ({k})", j) for j, k in parent[f'_{i}_candidate'].items()), prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}")),
classes='container'
))
elif isinstance(parent[f'_{i}_candidate'], list):
lst.append(Horizontal(
Label(i + f'\n{parent.get(f"_{i}_desc", "")}'),
Select((j, j) for j in parent[f'_{i}_candidate']),
Select(((j, j) for j in parent[f'_{i}_candidate']), prompt=f'{parent.get(f"{i}", "")}', id=domize(f"{parent_epath}.{i}")),
classes='container'
))
else:
@@ -102,7 +102,7 @@ class SettingScreen(Screen):
elif isinstance(parent[i], bool):
lst.append(Horizontal(
Label(i + f'\n{parent.get(f"_{i}_desc", "")}'),
Switch(value=str(parent[i]), id=domize(f"{parent_epath}.{i}")),
Switch(value=parent[i], id=domize(f"{parent_epath}.{i}")),
classes='container'))
elif isinstance(parent[i], int):
lst.append(Horizontal(
@@ -122,6 +122,7 @@ class SettingScreen(Screen):
def action_go_back(self) -> None:
"""返回上一屏幕"""
config_var.get().persist()
self.app.pop_screen()
def action_quit_app(self) -> None:
@@ -132,12 +133,27 @@ class SettingScreen(Screen):
"""打开导航器"""
self.app.push_screen(NavigatorScreen())
def on_button_pressed(self, event: Button.Pressed) -> None:
logger.debug(f"event.button.id: {event.button.id}")
"""处理按钮点击事件"""
if str(event.button.id) == 'apply':
pass
if str(event.button.id) == 'openfolder':
pass
if str(event.button.id) == 'cancel':
pass
def on_input_changed(self, event: Input.Changed) -> None:
widget_id = event.input.id
if not widget_id:
return
eepath = undomize(widget_id)
value = event.value
epath(config_var.get(), eepath, enable_modify=True, new_value=type(epath(config_var.get(), eepath))(value))
def on_switch_changed(self, event: Switch.Changed) -> None:
widget_id = event.switch.id
if not widget_id:
return
eepath = undomize(widget_id)
value = event.value
epath(config_var.get(), eepath, enable_modify=True, new_value=type(epath(config_var.get(), eepath))(value))
def on_select_changed(self, event: Select.Changed) -> None:
widget_id = event.select.id
if not widget_id:
return
eepath = undomize(widget_id)
value = event.value
epath(config_var.get(), eepath, enable_modify=True, new_value=type(epath(config_var.get(), eepath))(value))