Python tkinter-编译成功,但编译为Exe时程序运行不正确
因此,我使用tkinter创建了一种计算器,并通过快速设置在AppData目录中创建了一个save.dat文件,该文件可以作为python脚本使用,但在使用以下行编译时:Python tkinter-编译成功,但编译为Exe时程序运行不正确,python,tkinter,pyinstaller,exe,Python,Tkinter,Pyinstaller,Exe,因此,我使用tkinter创建了一种计算器,并通过快速设置在AppData目录中创建了一个save.dat文件,该文件可以作为python脚本使用,但在使用以下行编译时: pyinstaller--onefile-w file.py 它不起作用。exe可以很好地运行安装过程,但是在一些测试之后,当它到达if语句末尾时,如果save.dat已经存在(出现一个对话框,并且有一个“不再显示”勾选框和一个“确定”按钮),它似乎不会等待响应并关闭。当我检查taskmanager时,我看到它是一个后台进程,
pyinstaller--onefile-w file.py
它不起作用。exe
可以很好地运行安装过程,但是在一些测试之后,当它到达if语句末尾时,如果save.dat已经存在(出现一个对话框,并且有一个“不再显示”勾选框和一个“确定”按钮),它似乎不会等待响应并关闭。当我检查taskmanager时,我看到它是一个后台进程,但从来没有出现过窗口。我不明白是什么问题,所以我需要一些帮助。以下是我的代码片段:
from tkinter import *
from tkinter import messagebox
import pickle
import os.path
import sys
def saving():
messagebox.showinfo("Setting Up", "Setup will now begin")
path = os.path.expanduser("~/AppData/Local")
os.chdir(path)
os.makedirs("hydrocalc")
loc = os.path.expanduser("~/AppData/Local/hydrocalc/save.dat")
new = "0"
pickle.dump(new, open(loc, "wb"))
popup = Tk()
popup.withdraw()
loc = os.path.expanduser("~/AppData/Local/hydrocalc/save.dat")
if (os.path.exists(loc)):
i = pickle.load(open(loc, "rb"))
# then a few variables referring to the calculator
def world():
#the functions referring to the calculator
if (i == "0"):
popup.deiconify()
popup["bg"] = "#f0f0f0"
popup.title("INSTRUCTIONS")
labelpu = Label(popup, bg="white", text= #instructions on usage, justify="left").grid()
popup.resizable(width=False, height=False)
var = StringVar()
check = Checkbutton(popup, text="Don't Show Again", variable=var, onvalue="1", offvalue="0",
bg="#f0f0f0")
check.deselect()
check.grid()
lbl = Label(popup, text=var.get())
def btnOkay():
global i
lbl = Label(popup, text=var.get())
if (var.get() == "0"):
popup.withdraw()
i = "1"
calc.deiconify()
world()
elif (var.get() == "1"):
info = open(loc, 'w+')
new = "1"
pickle.dump(new, open(loc, "wb"))
popup.withdraw()
calc.deiconify()
i = "1"
world()
popup.deiconify()
btnOK = Button(popup, text="OK", bg="#f0f0f0", justify="center", width=20,
command=lambda:btnOkay()).grid()
elif (i == "1"):
calc.deiconify()
world()
else:
saving()
messagebox.showinfo("Setup Complete", "Setup is now complete. Please restart the program to
continue.")
sys.exit()
需要进行一些更改,请参阅下面更新的代码
从tkinter导入*
从tkinter导入消息框
进口泡菜
导入操作系统路径
导入系统
def saving():
messagebox.showinfo(“设置”,“设置现在开始”)
path=os.path.expanduser(appdata)
os.chdir(路径)
os.makedirs(appdir)
loc=os.path.expanduser(pref_文件)
new=“0”
pickle.dump(新的、开放的(loc,“wb”))
popup=Tk()
popup.draw()
appdata=os.getenv('appdata')#为方便起见进行了修改
appdir=os.path.join(appdata,'MyApp')
pref_file=os.path.join(appdir,'pref.pickle')
loc=os.path.expanduser(pref_文件)
如果(操作系统路径存在(loc)):
def world():
#与计算器有关的函数
如果(i==“0”):
popup.deiconify()
弹出窗口[“bg”]=“F0”
弹出标题(“说明”)
labelpu=Label(弹出窗口,bg=“white”,text=“用法说明”,justify=“left”).grid()
弹出窗口。可调整大小(宽度=假,高度=假)
var=StringVar()
检查=检查按钮(弹出窗口,text=“不再显示”,variable=var,onvalue=“1”,offvalue=“0”,
bg=“#f0”)
选中。取消选择()
check.grid()
lbl=标签(弹出窗口,文本=var.get())
btnOK=按钮(弹出,text=“OK”,bg=“#f0f0”,justify=“center”,width=20,command=lambda:btnOkay()).grid()
def btnOkay():
全球i
lbl=标签(弹出窗口,文本=var.get())
如果(变量get()=“0”):
popup.draw()
i=“1”
#计算去锥化()
打印('deconified calc')#添加用于调试
elif(变量get()=“1”):
信息=打开(位置“w+”)
new=“1”
pickle.dump(新的、开放的(loc,“wb”))
popup.draw()
#计算去锥化()
打印('deconified calc')#添加用于调试
i=“1”
世界()
popup.deiconify()
elif i==“1”:
#已注释calc.deiconify()以进行调试
打印('deconified calc')
exit()#为调试添加
i=酸洗负荷(打开(loc,“rb”))
世界()
其他:
储蓄()
messagebox.showinfo(“安装完成”,“安装现在完成。请重新启动程序以继续”。)
sys.exit()
popup.mainloop()
注释
- 您的程序没有
,因此您的窗口永远不会出现mainloop()
- 在
条件中没有对if
函数的初始调用world()
- 不要从
条件,它将导致无限递归elif i==“1”调用
:world()
我仍然不完全清楚您到底想要实现什么,请告诉我我的代码是否满足您的要求。希望有帮助。尝试
pyinstaller-F-c file.py
并捕获终端上的错误并用它更新问题,我尝试了这个,它打开一个空终端,运行保存功能(在我从以前的测试中删除文件后),然后再次运行时,另一个空终端几秒钟,然后它关闭。我正在使用Windows 10,但我认为这不应该是一个问题。它关闭是因为else
条件,对吗?这有什么错。我做了一个测试,我在每行代码后面放了一个消息框来显示这行代码,当它被迫减速时,它显示在它“显示”之后(它必须如此快,以至于屏幕甚至没有注册它,因为我从来没有见过它没有消息框),按钮(btnOK)就关闭了。else语句运行得非常好,只是它拒绝让我单击按钮ntry,将sys.exit()
替换为popup.destroy()
?当我复制和粘贴代码时,代码略有更改,就像我在部分中所做的那样,因此上面的代码无法正常运行,我将其包含在行中。然而,这个问题确实源于缺少mainloop()
,在看到代码在python中正确运行后,我忽略了这一点。现在我的exe
功能已完全正常,谢谢您的帮助!