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:
Misaka
2026-02-26 22:44:03 +08:00
parent 1b16842a2c
commit 3b7c00377f
46 changed files with 1488 additions and 974 deletions

View File

@@ -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()