From 6fd14b4e49620b7f6ba7ff59e77db5d96c85b7de Mon Sep 17 00:00:00 2001 From: houhuan Date: Mon, 4 May 2026 21:26:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20EXE=E7=89=88=E7=A6=81=E7=94=A8=E4=B8=80?= =?UTF-8?q?=E9=94=AE=E5=AE=89=E8=A3=85=E6=8B=96=E6=8B=BD=EF=BC=8C=E6=89=93?= =?UTF-8?q?=E5=8C=85=E6=97=B6=E9=9B=86=E6=88=90tkinterdnd2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - EXE版(sys.frozen)不显示安装按钮,提示用源码版安装后重新打包 - tkinterdnd2 加入 hidden_imports,打包时自动带上 Co-Authored-By: Claude Opus 4.7 --- app/ui/main_window.py | 44 +++++++++++++++++++++++++------------------ build_exe.py | 1 + 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/app/ui/main_window.py b/app/ui/main_window.py index 0114869..9a0734d 100644 --- a/app/ui/main_window.py +++ b/app/ui/main_window.py @@ -304,6 +304,8 @@ def _setup_drag_area(mid_container, theme, dnd_supported, log_text, status_bar): btn_row = tk.Frame(dnd_frame, bg=theme["card_bg"]) btn_row.pack(fill=tk.X) + is_frozen = getattr(sys, 'frozen', False) + def copy_install(): try: mid_container.winfo_toplevel().clipboard_clear() @@ -312,26 +314,32 @@ def _setup_drag_area(mid_container, theme, dnd_supported, log_text, status_bar): except Exception as e: messagebox.showwarning("复制失败", str(e)) + if is_frozen: + tk.Label( + btn_row, text="EXE版不支持运行时安装,请用源码版安装后重新打包", + bg=theme["card_bg"], fg="#999999", font=("Microsoft YaHei UI", 8) + ).pack(side=tk.RIGHT, padx=4) + else: + def install_and_restart(): + try: + add_to_log(log_text, "开始安装拖拽支持库 tkinterdnd2...\n", "info") + cmd = [sys.executable, "-m", "pip", "install", "tkinterdnd2"] + result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + add_to_log(log_text, result.stdout + "\n", "info") + add_to_log(log_text, "安装成功,准备重启程序以启用拖拽...\n", "success") + if messagebox.askyesno("安装完成", "已安装拖拽支持,是否立即重启应用?"): + os.execl(sys.executable, sys.executable, *sys.argv) + except subprocess.CalledProcessError as e: + add_to_log(log_text, f"安装失败: {e.stderr}\n", "error") + messagebox.showerror("安装失败", f"安装输出:\n{e.stderr}") + except Exception as e: + add_to_log(log_text, f"安装失败: {str(e)}\n", "error") + messagebox.showerror("安装失败", str(e)) + + create_modern_button(btn_row, "一键安装拖拽", install_and_restart, "primary", px_width=132, px_height=28).pack(side=tk.RIGHT, padx=(3, 0)) + create_modern_button(btn_row, "复制安装命令", copy_install, "primary", px_width=132, px_height=28).pack(side=tk.RIGHT) - def install_and_restart(): - try: - add_to_log(log_text, "开始安装拖拽支持库 tkinterdnd2...\n", "info") - cmd = [sys.executable, "-m", "pip", "install", "tkinterdnd2"] - result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) - add_to_log(log_text, result.stdout + "\n", "info") - add_to_log(log_text, "安装成功,准备重启程序以启用拖拽...\n", "success") - if messagebox.askyesno("安装完成", "已安装拖拽支持,是否立即重启应用?"): - os.execl(sys.executable, sys.executable, *sys.argv) - except subprocess.CalledProcessError as e: - add_to_log(log_text, f"安装失败: {e.stderr}\n", "error") - messagebox.showerror("安装失败", f"安装输出:\n{e.stderr}") - except Exception as e: - add_to_log(log_text, f"安装失败: {str(e)}\n", "error") - messagebox.showerror("安装失败", str(e)) - - create_modern_button(btn_row, "一键安装拖拽", install_and_restart, "primary", px_width=132, px_height=28).pack(side=tk.RIGHT, padx=(3, 0)) - # 点击拖拽框选择文件 def _click_select(evt=None): try: diff --git a/build_exe.py b/build_exe.py index 99974b3..0fd05bb 100644 --- a/build_exe.py +++ b/build_exe.py @@ -58,6 +58,7 @@ hidden_imports = [ 'xlutils', 'requests', 'dotenv', + 'tkinterdnd2', 'configparser', 'threading', 'datetime',