- Add ProductionIdInput widget with placeholder and multi-line support - Add UIConfig class for font family, font size, and input width settings - Refactor data extraction tab to use horizontal PanedWindow layout - Left panel: Production ID text input (draggable width) - Right panel: control panel and log output - Share Production IDs between data extraction and material validation tabs - Add UI settings group in settings page (font selection, size, input width) - For User users: automatically use shared Production IDs, simplified UI - Apply font settings to input and log widgets - Use sashpos() to set initial pane width correctly Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
187 lines
6.9 KiB
Python
187 lines
6.9 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
主窗口
|
||
|
||
ERP 自动化工具的主窗口,包含多个功能标签页。
|
||
"""
|
||
|
||
import tkinter as tk
|
||
from tkinter import ttk
|
||
from gui.config_manager import ConfigManager
|
||
from gui.data_extraction_tab import DataExtractionTab
|
||
from gui.material_validation_tab import MaterialValidationTab
|
||
from gui.settings_tab import SettingsTab
|
||
|
||
|
||
class MainWindow:
|
||
"""主窗口类"""
|
||
|
||
def __init__(self, root: tk.Tk, session_manager):
|
||
"""
|
||
初始化主窗口
|
||
|
||
Args:
|
||
root: Tk 根窗口
|
||
session_manager: SessionManager 实例,用于用户认证和权限管理
|
||
"""
|
||
self.root = root
|
||
self.config = ConfigManager()
|
||
self.session_manager = session_manager
|
||
self.shared_production_ids = [] # 共享的 Production ID 列表
|
||
|
||
# 设置窗口属性(包含用户信息)
|
||
user_type_display = "管理员" if session_manager.is_admin() else "用户"
|
||
self.root.title(f"ERP 自动化工具 v1.0 - {session_manager.get_username()} ({user_type_display})")
|
||
self.root.geometry("1000x700")
|
||
|
||
# 设置最小窗口大小
|
||
self.root.minsize(800, 600)
|
||
|
||
# 创建菜单栏
|
||
self.create_menu()
|
||
|
||
# 创建主界面
|
||
self.create_widgets()
|
||
|
||
# 创建状态栏
|
||
self.create_status_bar()
|
||
|
||
# 居中窗口
|
||
self._center_window()
|
||
|
||
def get_shared_production_ids(self) -> list:
|
||
"""获取共享的 Production ID 列表"""
|
||
return self.shared_production_ids.copy()
|
||
|
||
def update_shared_production_ids(self, production_ids: list):
|
||
"""更新共享的 Production ID 列表"""
|
||
self.shared_production_ids = production_ids
|
||
# 通知物料校验标签页 Production ID 已更新
|
||
if hasattr(self, 'validation_tab'):
|
||
if hasattr(self.validation_tab, 'on_production_ids_updated'):
|
||
self.validation_tab.on_production_ids_updated(production_ids)
|
||
|
||
def create_menu(self):
|
||
"""创建菜单栏"""
|
||
menubar = tk.Menu(self.root)
|
||
self.root.config(menu=menubar)
|
||
|
||
# 文件菜单
|
||
file_menu = tk.Menu(menubar, tearoff=0)
|
||
menubar.add_cascade(label="文件", menu=file_menu)
|
||
file_menu.add_command(label="退出", command=self.root.quit)
|
||
|
||
# 帮助菜单
|
||
help_menu = tk.Menu(menubar, tearoff=0)
|
||
menubar.add_cascade(label="帮助", menu=help_menu)
|
||
help_menu.add_command(label="关于", command=self.show_about)
|
||
|
||
def create_widgets(self):
|
||
"""创建主界面组件"""
|
||
# 创建 Notebook(标签页容器)
|
||
self.notebook = ttk.Notebook(self.root)
|
||
self.notebook.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
|
||
|
||
# 数据提取标签页(传递 self 以支持共享 Production ID)
|
||
self.extraction_tab = DataExtractionTab(self.notebook, self.config, self)
|
||
self.notebook.add(self.extraction_tab, text="数据提取")
|
||
|
||
# 物料校验标签页(传入 session_manager 和 main_window)
|
||
self.validation_tab = MaterialValidationTab(self.notebook, self.config, self.session_manager, self)
|
||
self.notebook.add(self.validation_tab, text="物料校验")
|
||
|
||
# 设置标签页(传入 session_manager)
|
||
self.settings_tab = SettingsTab(self.notebook, self.config, self.session_manager)
|
||
self.notebook.add(self.settings_tab, text="设置")
|
||
|
||
# 初始化:如果数据提取页面已有 Production ID,通知物料校验页面
|
||
self._initialize_shared_production_ids()
|
||
|
||
def _initialize_shared_production_ids(self):
|
||
"""初始化共享的 Production ID(从数据提取页面获取)"""
|
||
try:
|
||
if hasattr(self.extraction_tab, 'production_id_input'):
|
||
production_ids = self.extraction_tab.production_id_input.get()
|
||
if production_ids:
|
||
self.update_shared_production_ids(production_ids)
|
||
except Exception:
|
||
pass # 如果获取失败,忽略错误
|
||
|
||
def create_status_bar(self):
|
||
"""创建状态栏"""
|
||
self.status_bar = ttk.Frame(self.root, relief=tk.SUNKEN)
|
||
self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
|
||
|
||
# 状态文本
|
||
self.status_text = tk.StringVar()
|
||
self.status_text.set("就绪")
|
||
status_label = ttk.Label(
|
||
self.status_bar, textvariable=self.status_text, anchor=tk.W
|
||
)
|
||
status_label.pack(side=tk.LEFT, padx=5)
|
||
|
||
# 用户信息显示
|
||
user_type_display = "管理员" if self.session_manager.is_admin() else "用户"
|
||
original_admin = self.session_manager.get_original_admin()
|
||
|
||
if original_admin:
|
||
# Admin以其他用户身份操作
|
||
user_info_text = f"当前用户: {self.session_manager.get_username()} ({user_type_display}) - 以 {original_admin['username']} 身份登录"
|
||
else:
|
||
# 正常登录
|
||
user_info_text = f"当前用户: {self.session_manager.get_username()} ({user_type_display})"
|
||
|
||
self.user_info_var = tk.StringVar()
|
||
self.user_info_var.set(user_info_text)
|
||
user_label = ttk.Label(
|
||
self.status_bar, textvariable=self.user_info_var, anchor=tk.E
|
||
)
|
||
user_label.pack(side=tk.RIGHT, padx=5)
|
||
|
||
# 配置状态指示
|
||
self.config_status = tk.StringVar()
|
||
self.config_status.set("配置已加载")
|
||
config_label = ttk.Label(
|
||
self.status_bar, textvariable=self.config_status, anchor=tk.E
|
||
)
|
||
config_label.pack(side=tk.RIGHT, padx=5)
|
||
|
||
def _center_window(self):
|
||
"""将窗口居中显示"""
|
||
self.root.update_idletasks()
|
||
width = self.root.winfo_width()
|
||
height = self.root.winfo_height()
|
||
x = (self.root.winfo_screenwidth() // 2) - (width // 2)
|
||
y = (self.root.winfo_screenheight() // 2) - (height // 2)
|
||
self.root.geometry(f"{width}x{height}+{x}+{y}")
|
||
|
||
def show_about(self):
|
||
"""显示关于对话框"""
|
||
from tkinter import messagebox
|
||
|
||
messagebox.showinfo(
|
||
"关于 ERP 自动化工具",
|
||
"ERP 自动化工具 v1.0\n\n"
|
||
"功能:\n"
|
||
"• 数据提取 - 从 ERP 系统提取备料计划数据\n"
|
||
"• 物料校验 - 校验物料状态并匹配待删除物料\n"
|
||
"• 设置管理 - 管理系统配置\n"
|
||
"• 数据库持久化 - 将提取的数据自动保存到数据库\n\n"
|
||
"基于 Playwright 和 Python 开发",
|
||
)
|
||
|
||
def reload_config(self):
|
||
"""配置更新后重新加载配置到各个标签页"""
|
||
# 重新加载配置
|
||
self.config.reload()
|
||
|
||
# 通知各个标签页重新加载配置
|
||
if hasattr(self.extraction_tab, 'reload_config'):
|
||
self.extraction_tab.reload_config()
|
||
if hasattr(self.validation_tab, 'reload_config'):
|
||
self.validation_tab.reload_config()
|
||
|
||
# 更新状态栏
|
||
self.config_status.set("配置已重新加载")
|