Python GUI程序经auto-py-to-exe转exe后按钮点击无响应求助
问题:Python GUI程序转exe后按钮无响应
我编写了一款带GUI的Python程序,界面包含按钮和若干输入框。点击按钮时会创建包含多个子文件夹的新目录,并将输入框中的信息保存至该目录下的CSV文件中。在PyCharm中运行该程序一切正常,但使用auto-py-to-exe将其转换为exe文件后,程序能够正常启动,但点击按钮时无任何反应。
核心代码
def create_folder(EingabeName_text): folder_name = EingabeName_text folder_path = os.path.join(os.path.dirname(__file__), "BHW", folder_name) os.mkdir(folder_path) briefe_path = os.path.join(folder_path, "_Briefe") rechnung_path = os.path.join(folder_path, "_Rechnung") ordnerKunde_path = os.path.join(folder_path, "ordner1") ordner2_path = os.path.join(folder_path, "ordner2") ordner3_path = os.path.join(folder_path, "ordner3") ordner4_path = os.path.join(folder_path, "ordner4") os.mkdir(briefe_path) os.mkdir(rechnung_path) os.mkdir(ordnerKunde_path) os.mkdir(ordner2_path) os.mkdir(ordner3_path) os.mkdir(ordner4_path) csv_folder_path = os.path.join(folder_path, f"{EingabeName_text}.csv") with open(csv_folder_path, 'w', newline='') as csv_file_briefe: fieldnames = ['Kundendaten'] writer = csv.DictWriter(csv_file_briefe, fieldnames=fieldnames) writer.writeheader() writer.writerow({'Kundendaten': EingabeName.get()}) writer.writerow({'Kundendaten': EingabeStrasse.get()}) writer.writerow({'Kundendaten': EingabePlzOrt.get()}) writer.writerow({'Kundendaten': 'Geburtsdatum:'}) writer.writerow({'Kundendaten': EingabeGeurtstag.get()}) writer.writerow({'Kundendaten': 'Handynummer:'}) writer.writerow({'Kundendaten': EingabeHandy.get()}) writer.writerow({'Kundendaten': 'Rechnungsnummer:'}) writer.writerow({'Kundendaten': EingabeRnummer.get()}) writer.writerow({'Kundendaten': 'Informationen:'}) writer.writerow({'Kundendaten': textbox.get("1.0", "end")})
依赖库
import os import time from tkinter.filedialog import askopenfilename import customtkinter import customtkinter as ctk import csv from PIL import Image
解决方案
1. 修复路径问题
exe运行时,os.path.dirname(__file__)指向临时解压目录,且可能无写入权限,替换为稳定路径:
import sys def create_folder(EingabeName_text): folder_name = EingabeName_text # 方式1:获取exe所在目录 if getattr(sys, 'frozen', False): base_path = os.path.dirname(sys.executable) else: base_path = os.path.dirname(__file__) folder_path = os.path.join(base_path, "BHW", folder_name) # 先创建父目录(避免BHW目录不存在报错) os.makedirs(folder_path, exist_ok=True) # 简化子目录创建 sub_folders = ["_Briefe", "_Rechnung", "ordner1", "ordner2", "ordner3", "ordner4"] for sub in sub_folders: os.makedirs(os.path.join(folder_path, sub), exist_ok=True) # 剩余代码...
也可以改用用户文档目录(更安全,避免权限问题):
folder_path = os.path.join(os.path.expanduser("~"), "Documents", "BHW", folder_name)
2. 捕获异常并暴露错误
按钮无响应通常是代码抛出异常但未提示,添加异常捕获:
def create_folder(EingabeName_text): try: # 原代码内容... except Exception as e: # 弹窗显示错误 error_win = ctk.CTkToplevel() error_win.title("错误提示") ctk.CTkLabel(error_win, text=f"操作失败:{str(e)}").pack(padx=20, pady=20) # 同时写入日志文件 with open("error_log.txt", "w", encoding="utf-8") as f: f.write(str(e))
3. 调整打包配置
- 先取消auto-py-to-exe的
--windowed选项,用控制台模式运行exe,直接查看控制台输出的错误信息。 - 检查customtkinter和PIL的资源是否被正确打包,若遗漏可手动添加
--add-data参数,比如:--add-data "path/to/customtkinter/themes;customtkinter/themes" --add-data "path/to/PIL/images;PIL/images"
4. 修复全局变量作用域问题
代码中直接使用全局控件对象(如EingabeName.get()),打包后可能出现作用域问题,改为将控件作为参数传入:
def create_folder(name_entry, strasse_entry, plz_entry, geburtstag_entry, handy_entry, rnummer_entry, text_box): # 使用传入的控件获取值 with open(csv_folder_path, 'w', newline='') as csv_file_briefe: # ...其他代码... writer.writerow({'Kundendaten': name_entry.get()}) writer.writerow({'Kundendaten': strasse_entry.get()}) # 其余输入框同理
内容的提问来源于stack exchange,提问作者David Nguyen
相关产品推荐
相关产品推荐

