style: format all Python files with Black
Apply Black formatter to the entire codebase for consistent code style. Co-Authored-By: Claude (glm-5) <noreply@anthropic.com>
This commit is contained in:
@@ -38,7 +38,9 @@ class SettingsTab(ttk.Frame):
|
||||
def create_widgets(self):
|
||||
"""创建界面组件"""
|
||||
# 判断用户类型
|
||||
is_user_only = self.session_manager and self.session_manager.get_user_type() == 'User'
|
||||
is_user_only = (
|
||||
self.session_manager and self.session_manager.get_user_type() == "User"
|
||||
)
|
||||
|
||||
# 创建主容器,带滚动条
|
||||
canvas = tk.Canvas(self)
|
||||
@@ -158,7 +160,9 @@ class SettingsTab(ttk.Frame):
|
||||
self.sqlserver_frame = ttk.Frame(group)
|
||||
self.sqlserver_frame.grid(row=1, column=0, columnspan=2, sticky="ew", pady=5)
|
||||
|
||||
ttk.Label(self.sqlserver_frame, text="服务器:").grid(row=0, column=0, sticky="w", pady=5)
|
||||
ttk.Label(self.sqlserver_frame, text="服务器:").grid(
|
||||
row=0, column=0, sticky="w", pady=5
|
||||
)
|
||||
self.db_server_var = tk.StringVar()
|
||||
ttk.Entry(self.sqlserver_frame, textvariable=self.db_server_var, width=50).grid(
|
||||
row=0, column=1, pady=5, sticky="ew"
|
||||
@@ -167,16 +171,24 @@ class SettingsTab(ttk.Frame):
|
||||
# MySQL 配置
|
||||
self.mysql_frame = ttk.Frame(group)
|
||||
|
||||
ttk.Label(self.mysql_frame, text="主机:").grid(row=0, column=0, sticky="w", pady=5)
|
||||
ttk.Label(self.mysql_frame, text="主机:").grid(
|
||||
row=0, column=0, sticky="w", pady=5
|
||||
)
|
||||
self.mysql_host_var = tk.StringVar()
|
||||
ttk.Entry(self.mysql_frame, textvariable=self.mysql_host_var, width=50).grid(
|
||||
row=0, column=1, pady=5, sticky="ew"
|
||||
)
|
||||
|
||||
ttk.Label(self.mysql_frame, text="端口:").grid(row=1, column=0, sticky="w", pady=5)
|
||||
ttk.Label(self.mysql_frame, text="端口:").grid(
|
||||
row=1, column=0, sticky="w", pady=5
|
||||
)
|
||||
self.mysql_port_var = tk.IntVar(value=3306)
|
||||
ttk.Spinbox(
|
||||
self.mysql_frame, from_=1, to=65535, textvariable=self.mysql_port_var, width=10
|
||||
self.mysql_frame,
|
||||
from_=1,
|
||||
to=65535,
|
||||
textvariable=self.mysql_port_var,
|
||||
width=10,
|
||||
).grid(row=1, column=1, sticky="w", pady=5)
|
||||
|
||||
# 通用配置(两种数据库都需要)
|
||||
@@ -207,7 +219,9 @@ class SettingsTab(ttk.Frame):
|
||||
self.mysql_frame.grid(row=1, column=0, columnspan=2, sticky="ew", pady=5)
|
||||
else:
|
||||
self.mysql_frame.grid_forget()
|
||||
self.sqlserver_frame.grid(row=1, column=0, columnspan=2, sticky="ew", pady=5)
|
||||
self.sqlserver_frame.grid(
|
||||
row=1, column=0, columnspan=2, sticky="ew", pady=5
|
||||
)
|
||||
|
||||
def _create_browser_group(self, parent):
|
||||
"""创建浏览器配置组"""
|
||||
@@ -232,7 +246,9 @@ class SettingsTab(ttk.Frame):
|
||||
def _create_paths_group(self, parent):
|
||||
"""创建路径配置组"""
|
||||
# 根据用户类型调整 grid 位置
|
||||
is_user_only = self.session_manager and self.session_manager.get_user_type() == 'User'
|
||||
is_user_only = (
|
||||
self.session_manager and self.session_manager.get_user_type() == "User"
|
||||
)
|
||||
|
||||
group = ttk.LabelFrame(parent, text="路径设置", padding=10)
|
||||
if is_user_only:
|
||||
@@ -261,9 +277,9 @@ class SettingsTab(ttk.Frame):
|
||||
|
||||
# 校验输出文件
|
||||
ttk.Label(group, text="校验输出文件:").grid(row=3, column=0, sticky="w", pady=5)
|
||||
ttk.Entry(group, textvariable=self.validation_output_filename_var, width=40).grid(
|
||||
row=3, column=1, columnspan=2, sticky="ew", pady=5
|
||||
)
|
||||
ttk.Entry(
|
||||
group, textvariable=self.validation_output_filename_var, width=40
|
||||
).grid(row=3, column=1, columnspan=2, sticky="ew", pady=5)
|
||||
|
||||
group.columnconfigure(0, weight=1)
|
||||
|
||||
@@ -275,16 +291,14 @@ class SettingsTab(ttk.Frame):
|
||||
# dryrun 模式设置
|
||||
self.user_dryrun_var = tk.BooleanVar(value=False)
|
||||
ttk.Checkbutton(
|
||||
group,
|
||||
text="预览模式 (执行删除时不保存更改)",
|
||||
variable=self.user_dryrun_var
|
||||
group, text="预览模式 (执行删除时不保存更改)", variable=self.user_dryrun_var
|
||||
).grid(row=0, column=0, sticky="w", pady=5)
|
||||
|
||||
# 说明文字
|
||||
hint_label = ttk.Label(
|
||||
group,
|
||||
text="提示:勾选后,执行删除操作时将只预览不实际保存,用于测试流程。",
|
||||
foreground="gray"
|
||||
foreground="gray",
|
||||
)
|
||||
hint_label.grid(row=1, column=0, sticky="w", pady=(0, 5))
|
||||
|
||||
@@ -335,7 +349,12 @@ class SettingsTab(ttk.Frame):
|
||||
data_source_combo = ttk.Combobox(
|
||||
group,
|
||||
textvariable=self.validation_data_source_var,
|
||||
values=["database_full", "database_filtered", "excel_existing", "excel_full"],
|
||||
values=[
|
||||
"database_full",
|
||||
"database_filtered",
|
||||
"excel_existing",
|
||||
"excel_full",
|
||||
],
|
||||
state="readonly",
|
||||
width=30,
|
||||
)
|
||||
@@ -344,20 +363,28 @@ class SettingsTab(ttk.Frame):
|
||||
# 使用数据库
|
||||
self.validation_use_database_var = tk.BooleanVar()
|
||||
ttk.Checkbutton(
|
||||
group, text="使用数据库作为数据源", variable=self.validation_use_database_var
|
||||
group,
|
||||
text="使用数据库作为数据源",
|
||||
variable=self.validation_use_database_var,
|
||||
).grid(row=1, column=0, columnspan=2, sticky="w", pady=5)
|
||||
|
||||
# 输出文件名
|
||||
ttk.Label(group, text="输出文件名:").grid(row=2, column=0, sticky="w", pady=5)
|
||||
ttk.Entry(group, textvariable=self.validation_output_filename_var, width=30).grid(
|
||||
row=2, column=1, sticky="w", pady=5
|
||||
)
|
||||
ttk.Entry(
|
||||
group, textvariable=self.validation_output_filename_var, width=30
|
||||
).grid(row=2, column=1, sticky="w", pady=5)
|
||||
|
||||
# 批次大小
|
||||
ttk.Label(group, text="数据库批次大小:").grid(row=3, column=0, sticky="w", pady=5)
|
||||
ttk.Label(group, text="数据库批次大小:").grid(
|
||||
row=3, column=0, sticky="w", pady=5
|
||||
)
|
||||
self.validation_batch_size_var = tk.IntVar(value=2000)
|
||||
ttk.Spinbox(
|
||||
group, from_=100, to=2000, textvariable=self.validation_batch_size_var, width=10
|
||||
group,
|
||||
from_=100,
|
||||
to=2000,
|
||||
textvariable=self.validation_batch_size_var,
|
||||
width=10,
|
||||
).grid(row=3, column=1, sticky="w", pady=5)
|
||||
|
||||
# 匹配模式
|
||||
@@ -375,15 +402,17 @@ class SettingsTab(ttk.Frame):
|
||||
# CRUD 操作
|
||||
self.validation_enable_crud_var = tk.BooleanVar()
|
||||
ttk.Checkbutton(
|
||||
group, text="启用 CRUD 操作(管理待删除物料)", variable=self.validation_enable_crud_var
|
||||
group,
|
||||
text="启用 CRUD 操作(管理待删除物料)",
|
||||
variable=self.validation_enable_crud_var,
|
||||
).grid(row=5, column=0, columnspan=2, sticky="w", pady=5)
|
||||
|
||||
# 默认负责人
|
||||
ttk.Label(group, text="默认负责人:").grid(row=6, column=0, sticky="w", pady=5)
|
||||
self.validation_default_manager_var = tk.StringVar()
|
||||
ttk.Entry(group, textvariable=self.validation_default_manager_var, width=30).grid(
|
||||
row=6, column=1, sticky="w", pady=5
|
||||
)
|
||||
ttk.Entry(
|
||||
group, textvariable=self.validation_default_manager_var, width=30
|
||||
).grid(row=6, column=1, sticky="w", pady=5)
|
||||
|
||||
group.columnconfigure(1, weight=1)
|
||||
|
||||
@@ -398,7 +427,14 @@ class SettingsTab(ttk.Frame):
|
||||
font_combo = ttk.Combobox(
|
||||
group,
|
||||
textvariable=self.ui_font_family_var,
|
||||
values=["Microsoft YaHei UI", "SimSun", "KaiTi", "FangSong", "Arial", "Segoe UI"],
|
||||
values=[
|
||||
"Microsoft YaHei UI",
|
||||
"SimSun",
|
||||
"KaiTi",
|
||||
"FangSong",
|
||||
"Arial",
|
||||
"Segoe UI",
|
||||
],
|
||||
state="readonly",
|
||||
width=30,
|
||||
)
|
||||
@@ -412,7 +448,9 @@ class SettingsTab(ttk.Frame):
|
||||
).grid(row=1, column=1, sticky="w", pady=5)
|
||||
|
||||
# Production ID 输入框宽度
|
||||
ttk.Label(group, text="输入框宽度(字符):").grid(row=2, column=0, sticky="w", pady=5)
|
||||
ttk.Label(group, text="输入框宽度(字符):").grid(
|
||||
row=2, column=0, sticky="w", pady=5
|
||||
)
|
||||
self.ui_input_width_var = tk.IntVar(value=20)
|
||||
ttk.Spinbox(
|
||||
group, from_=10, to=100, textvariable=self.ui_input_width_var, width=10
|
||||
@@ -423,14 +461,18 @@ class SettingsTab(ttk.Frame):
|
||||
def load_settings(self):
|
||||
"""从配置加载设置到界面"""
|
||||
# 判断是否为仅测试用户模式
|
||||
is_user_only = self.session_manager and self.session_manager.get_user_type() == 'User'
|
||||
is_user_only = (
|
||||
self.session_manager and self.session_manager.get_user_type() == "User"
|
||||
)
|
||||
|
||||
if is_user_only:
|
||||
# User 用户模式 - 只需要加载路径设置到界面
|
||||
# 路径设置
|
||||
self.data_dir_selector.set(self.config.get("paths.data_dir", ""))
|
||||
self.default_output_var.set(self.config.get("paths.default_output", ""))
|
||||
self.validation_output_filename_var.set(self.config.get("paths.validation_output", ""))
|
||||
self.validation_output_filename_var.set(
|
||||
self.config.get("paths.validation_output", "")
|
||||
)
|
||||
# 执行设置
|
||||
self.user_dryrun_var.set(self.config.get("execution.dryrun", False))
|
||||
return
|
||||
@@ -475,32 +517,54 @@ class SettingsTab(ttk.Frame):
|
||||
self.verbose_var.set(self.config.get("extraction.verbose", True))
|
||||
self.auto_convert_var.set(self.config.get("extraction.auto_convert", True))
|
||||
self.merge_batches_var.set(self.config.get("extraction.merge_batches", True))
|
||||
self.enable_db_persistence_var.set(self.config.get("extraction.enable_db_persistence", False))
|
||||
self.enable_db_persistence_var.set(
|
||||
self.config.get("extraction.enable_db_persistence", False)
|
||||
)
|
||||
|
||||
# 校验设置
|
||||
self.validation_data_source_var.set(self.config.get("validation.data_source", "database_full"))
|
||||
self.validation_use_database_var.set(self.config.get("validation.use_database", True))
|
||||
self.validation_output_filename_var.set(self.config.get("paths.validation_output", "物料状态校验结果.xlsx"))
|
||||
self.validation_batch_size_var.set(self.config.get("validation.batch_size", 2000))
|
||||
self.validation_match_mode_var.set(self.config.get("validation.match_mode", "substring"))
|
||||
self.validation_enable_crud_var.set(self.config.get("validation.enable_crud_operations", False))
|
||||
self.validation_default_manager_var.set(self.config.get("validation.default_manager", ""))
|
||||
self.validation_data_source_var.set(
|
||||
self.config.get("validation.data_source", "database_full")
|
||||
)
|
||||
self.validation_use_database_var.set(
|
||||
self.config.get("validation.use_database", True)
|
||||
)
|
||||
self.validation_output_filename_var.set(
|
||||
self.config.get("paths.validation_output", "物料状态校验结果.xlsx")
|
||||
)
|
||||
self.validation_batch_size_var.set(
|
||||
self.config.get("validation.batch_size", 2000)
|
||||
)
|
||||
self.validation_match_mode_var.set(
|
||||
self.config.get("validation.match_mode", "substring")
|
||||
)
|
||||
self.validation_enable_crud_var.set(
|
||||
self.config.get("validation.enable_crud_operations", False)
|
||||
)
|
||||
self.validation_default_manager_var.set(
|
||||
self.config.get("validation.default_manager", "")
|
||||
)
|
||||
|
||||
# UI 设置
|
||||
self.ui_font_family_var.set(self.config.get("ui.font_family", "Microsoft YaHei UI"))
|
||||
self.ui_font_family_var.set(
|
||||
self.config.get("ui.font_family", "Microsoft YaHei UI")
|
||||
)
|
||||
self.ui_font_size_var.set(self.config.get("ui.font_size", 10))
|
||||
self.ui_input_width_var.set(self.config.get("ui.production_id_input_width", 20))
|
||||
|
||||
def save_settings(self):
|
||||
"""保存界面设置到配置"""
|
||||
# 判断是否为仅测试用户模式
|
||||
is_user_only = self.session_manager and self.session_manager.get_user_type() == 'User'
|
||||
is_user_only = (
|
||||
self.session_manager and self.session_manager.get_user_type() == "User"
|
||||
)
|
||||
|
||||
if is_user_only:
|
||||
# User 用户模式 - 只保存路径设置和执行设置
|
||||
self.config.set("paths.data_dir", self.data_dir_selector.get())
|
||||
self.config.set("paths.default_output", self.default_output_var.get())
|
||||
self.config.set("paths.validation_output", self.validation_output_filename_var.get())
|
||||
self.config.set(
|
||||
"paths.validation_output", self.validation_output_filename_var.get()
|
||||
)
|
||||
# 保存执行设置
|
||||
self.config.set("execution.dryrun", self.user_dryrun_var.get())
|
||||
|
||||
@@ -550,16 +614,26 @@ class SettingsTab(ttk.Frame):
|
||||
self.config.set("extraction.verbose", self.verbose_var.get())
|
||||
self.config.set("extraction.auto_convert", self.auto_convert_var.get())
|
||||
self.config.set("extraction.merge_batches", self.merge_batches_var.get())
|
||||
self.config.set("extraction.enable_db_persistence", self.enable_db_persistence_var.get())
|
||||
self.config.set(
|
||||
"extraction.enable_db_persistence", self.enable_db_persistence_var.get()
|
||||
)
|
||||
|
||||
# 校验设置
|
||||
self.config.set("validation.data_source", self.validation_data_source_var.get())
|
||||
self.config.set("validation.use_database", self.validation_use_database_var.get())
|
||||
self.config.set("paths.validation_output", self.validation_output_filename_var.get())
|
||||
self.config.set(
|
||||
"validation.use_database", self.validation_use_database_var.get()
|
||||
)
|
||||
self.config.set(
|
||||
"paths.validation_output", self.validation_output_filename_var.get()
|
||||
)
|
||||
self.config.set("validation.batch_size", self.validation_batch_size_var.get())
|
||||
self.config.set("validation.match_mode", self.validation_match_mode_var.get())
|
||||
self.config.set("validation.enable_crud_operations", self.validation_enable_crud_var.get())
|
||||
self.config.set("validation.default_manager", self.validation_default_manager_var.get())
|
||||
self.config.set(
|
||||
"validation.enable_crud_operations", self.validation_enable_crud_var.get()
|
||||
)
|
||||
self.config.set(
|
||||
"validation.default_manager", self.validation_default_manager_var.get()
|
||||
)
|
||||
|
||||
# UI 设置
|
||||
self.config.set("ui.font_family", self.ui_font_family_var.get())
|
||||
@@ -581,7 +655,7 @@ class SettingsTab(ttk.Frame):
|
||||
# 获取主窗口
|
||||
main_window = self.winfo_toplevel()
|
||||
# 调用主窗口的 reload_config 方法(如果存在)
|
||||
if hasattr(main_window, 'reload_config'):
|
||||
if hasattr(main_window, "reload_config"):
|
||||
main_window.reload_config()
|
||||
except Exception:
|
||||
pass
|
||||
@@ -602,7 +676,7 @@ class SettingsTab(ttk.Frame):
|
||||
database=self.config.get("database.database", ""),
|
||||
user=self.config.get("database.username", ""),
|
||||
password=self.config.get("database.password", ""),
|
||||
connection_timeout=5
|
||||
connection_timeout=5,
|
||||
)
|
||||
conn.close()
|
||||
messagebox.showinfo("成功", "MySQL 数据库连接测试成功!")
|
||||
@@ -621,9 +695,14 @@ class SettingsTab(ttk.Frame):
|
||||
|
||||
except ImportError:
|
||||
if db_type == "mysql":
|
||||
messagebox.showerror("错误", "未安装 mysql-connector-python,请运行:\npip install mysql-connector-python")
|
||||
messagebox.showerror(
|
||||
"错误",
|
||||
"未安装 mysql-connector-python,请运行:\npip install mysql-connector-python",
|
||||
)
|
||||
else:
|
||||
messagebox.showerror("错误", "未安装 pyodbc,请运行:\npip install pyodbc")
|
||||
messagebox.showerror(
|
||||
"错误", "未安装 pyodbc,请运行:\npip install pyodbc"
|
||||
)
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"数据库连接失败:\n{str(e)}")
|
||||
|
||||
@@ -634,8 +713,11 @@ class SettingsTab(ttk.Frame):
|
||||
|
||||
def reset_defaults(self):
|
||||
"""恢复默认设置"""
|
||||
if messagebox.askyesno("确认", "确定要恢复默认设置吗?这将覆盖 .env 文件中的所有配置。"):
|
||||
if messagebox.askyesno(
|
||||
"确认", "确定要恢复默认设置吗?这将覆盖 .env 文件中的所有配置。"
|
||||
):
|
||||
from config.schema import AppConfig
|
||||
|
||||
self.config.config = AppConfig.from_env() # 重新加载默认配置
|
||||
self.config.save()
|
||||
self.load_settings()
|
||||
|
||||
Reference in New Issue
Block a user