完善UI操作逻辑

This commit is contained in:
2025-11-06 18:13:10 +08:00
parent 1ee8f0426e
commit d988f5eb48
9 changed files with 188 additions and 151 deletions
+34 -33
View File
@@ -3,7 +3,8 @@ from tkinter import ttk, messagebox, filedialog
from datetime import datetime
import threading
import time
from core.eventbus import ActionDisableMarketData, ActionEnableMarketData, ActionEventDeleteTradeTarget, ActionEventDisableTrade, ActionEventEnableTrade, MarketDataUpdate, MarketDataEnabled, MarketDataDisabled, ResultEventTradeDisabled, ResultEventTradeEnabled, ResultEventTradeTargetDeleted, event_bus
import core.eventbus as eBus
from core.logger import LogData, LogLevel
from core.strategy_db import TradeTarget
import configparser
import sfgrid_constants
@@ -28,12 +29,13 @@ class TradeTargetUI:
# 不再自动启动刷新线程,由市场数据开关控制
def registerEventHandler(self):
event_bus.subscribe(MarketDataUpdate, self.onTradeTargetUpdated)
event_bus.subscribe(ResultEventTradeEnabled, self.onTradeEnabled)
event_bus.subscribe(ResultEventTradeDisabled, self.onTradeDisabled)
event_bus.subscribe(MarketDataEnabled, self.onMarketDataToggled)
event_bus.subscribe(MarketDataDisabled, self.onMarketDataToggled)
event_bus.subscribe(ResultEventTradeTargetDeleted, self.onTradeTargetDeleted)
eBus.event_bus.subscribe(eBus.MarketDataUpdate, self.onTradeTargetUpdated)
eBus.event_bus.subscribe(eBus.ResultEventTradeEnabled, self.onTradeEnabled)
eBus.event_bus.subscribe(eBus.ResultEventTradeDisabled, self.onTradeDisabled)
eBus.event_bus.subscribe(eBus.MarketDataEnabled, self.onMarketDataToggled)
eBus.event_bus.subscribe(eBus.MarketDataDisabled, self.onMarketDataToggled)
eBus.event_bus.subscribe(eBus.ResultEventTradeTargetDeleted, self.onTradeTargetDeleted)
eBus.event_bus.subscribe(eBus.EventPrintLog, self.onLog)
def start_refresh_thread(self):
"""启动刷新线程"""
@@ -59,11 +61,11 @@ class TradeTargetUI:
if id in self.data:
del self.data[id]
# 添加日志
self.add_log("INFO", f"交易标的已删除,ID: {id}")
self.add_log(LogLevel.INFO, f"交易标的已删除,ID: {id}")
def onMarketDataToggled(self, data:bool):
self.market_data_enabled = self.market_data_switch_var.get()
self.add_log("INFO", "市场数据监听已" + ("启用" if data else "禁用"))
self.add_log(LogLevel.INFO, "市场数据监听已" + ("启用" if data else "禁用"))
# 同步UI刷新线程状态
if data:
self.start_ui_refresh()
@@ -71,10 +73,10 @@ class TradeTargetUI:
self.stop_ui_refresh()
def onTradeEnabled(self, target:TradeTarget):
self.add_log("INFO", f"交易启用: {target.stock_code} - {target.stock_name}")
self.add_log(LogLevel.INFO, f"交易启用: {target.stock_code} - {target.stock_name}")
def onTradeDisabled(self, target:TradeTarget):
self.add_log("INFO", f"交易禁用: {target.stock_code} - {target.stock_name}")
self.add_log(LogLevel.INFO, f"交易禁用: {target.stock_code} - {target.stock_name}")
def onTradeTargetUpdated(self, target: TradeTarget):
@@ -137,11 +139,11 @@ class TradeTargetUI:
print(f'市场数据监听开关')
self.market_data_enabled = self.market_data_switch_var.get()
if self.market_data_enabled:
event_bus.publish(ActionEnableMarketData, True)
eBus.event_bus.publish(eBus.ActionEnableMarketData, True)
# 同步开启UI刷新线程
self.start_ui_refresh()
else:
event_bus.publish(ActionDisableMarketData, True)
eBus.event_bus.publish(eBus.ActionDisableMarketData, True)
# 同步关闭UI刷新线程
self.stop_ui_refresh()
@@ -150,14 +152,14 @@ class TradeTargetUI:
if not self.refresh_thread_running:
self.refresh_thread_running = True
self.start_refresh_thread()
self.add_log("INFO", "UI刷新线程已启动")
self.add_log(LogLevel.INFO, "UI刷新线程已启动")
def stop_ui_refresh(self):
"""停止UI刷新线程"""
if self.refresh_thread_running:
self.stop_refresh_thread()
self.refresh_thread_running = False
self.add_log("INFO", "UI刷新线程已停止")
self.add_log(LogLevel.INFO, "UI刷新线程已停止")
def create_menu_bar(self):
"""创建菜单栏"""
@@ -330,7 +332,7 @@ class TradeTargetUI:
if selected:
item = selected[0]
values = self.trade_table.item(item)['values']
self.add_log("DEBUG", f"双击查看详情: {values[0]} - {values[1]}")
self.add_log(LogLevel.DEBUG, f"双击查看详情: {values[0]} - {values[1]}")
def get_selected_target(self):
"""获取选中的交易标的"""
@@ -351,10 +353,6 @@ class TradeTargetUI:
return None
def onLog(self, level: str, message: str):
"""接收外部日志消息并显示在日志组件中"""
self.add_log(level, message)
def start_selected_trade(self):
"""启动选中的交易"""
target = self.get_selected_target()
@@ -374,12 +372,12 @@ class TradeTargetUI:
if result:
target.enabled = True # type: ignore
event_bus.publish(ActionEventEnableTrade, target.get_id())
eBus.event_bus.publish(eBus.ActionEventEnableTrade, target.get_id())
# self.add_log("INFO", f"已启动交易: {target.stock_code} - {target.stock_name}")
# messagebox.showinfo("启动成功", f"已启动 {target.stock_code} ({target.stock_name}) 的交易")
def on_trade_enabled(self, target: TradeTarget):
event_bus.publish(ActionEventEnableTrade, target)
eBus.event_bus.publish(eBus.ActionEventEnableTrade, target)
def pause_selected_trade(self):
"""暂停选中的交易"""
@@ -400,7 +398,7 @@ class TradeTargetUI:
if result:
target.enabled = False # type: ignore
event_bus.publish(ActionEventDisableTrade, target.get_id())
eBus.event_bus.publish(eBus.ActionEventDisableTrade, target.get_id())
# self.add_log("INFO", f"已暂停交易: {target.stock_code} - {target.stock_name}")
# messagebox.showinfo("暂停成功", f"已暂停 {target.stock_code} ({target.stock_name}) 的交易")
@@ -421,8 +419,8 @@ class TradeTargetUI:
if result:
# 通过事件总线发出删除动作
event_bus.publish(ActionEventDeleteTradeTarget, target.get_id())
self.add_log("INFO", f"已发送删除请求: {target.stock_code} - {target.stock_name}")
eBus.event_bus.publish(eBus.ActionEventDeleteTradeTarget, target.get_id())
self.add_log(LogLevel.INFO, f"已发送删除请求: {target.stock_code} - {target.stock_name}")
def add_trade_target(self):
"""添加新的交易标的"""
@@ -463,7 +461,7 @@ class TradeTargetUI:
return
# 发布事件通知主控制器添加标的
event_bus.publish("add_trade_target", stock_code)
eBus.event_bus.publish(eBus.ActionEventAddTradeTarget, stock_code)
add_window.destroy()
def cancel_add():
@@ -476,7 +474,7 @@ class TradeTargetUI:
# 绑定回车键确认
stock_code_entry.bind('<Return>', lambda event: confirm_add())
self.add_log("INFO", "点击添加交易标的按钮")
self.add_log(LogLevel.INFO, "点击添加交易标的按钮")
def toggle_log_panel(self):
"""切换日志面板的显示/隐藏"""
@@ -514,18 +512,21 @@ class TradeTargetUI:
values = self.trade_table.item(item)['values']
if values and values[0] in selected_values:
self.trade_table.selection_add(item)
def add_log(self, level, message):
def onLog(self, data:LogData):
self.add_log(data.level, data.message)
def add_log(self, level:LogLevel, message):
"""添加日志记录"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.log_table.insert('', 0, values=(timestamp, level, message))
self.log_table.insert('', 0, values=(timestamp, level.value, message))
def clear_logs(self):
"""清空日志记录"""
# 删除所有日志项
for item in self.log_table.get_children():
self.log_table.delete(item)
self.add_log("INFO", "日志已清空")
self.add_log(LogLevel.DEBUG, "日志已清空")
def system_settings(self):
"""系统设置"""
@@ -813,12 +814,12 @@ class TradeTargetUI:
sfgrid_constants.initConfig()
messagebox.showinfo("成功", f"配置已保存!\n网格价格序列: {grid_price_str}\n部分配置可能需要重启程序后生效。")
self.add_log("INFO", f"系统配置已更新 - 网格数量: {len(grid_prices)}")
self.add_log(LogLevel.INFO, f"系统配置已更新 - 网格数量: {len(grid_prices)}")
settings_window.destroy()
except Exception as e:
messagebox.showerror("错误", f"保存配置失败:{str(e)}")
self.add_log("ERROR", f"保存配置失败: {str(e)}")
self.add_log(LogLevel.ERROR, f"保存配置失败: {str(e)}")
def cancel_settings():
"""取消设置"""