Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter-编译成功,但编译为Exe时程序运行不正确_Python_Tkinter_Pyinstaller_Exe - Fatal编程技术网

Python tkinter-编译成功,但编译为Exe时程序运行不正确

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时,我看到它是一个后台进程,

因此,我使用tkinter创建了一种计算器,并通过快速设置在AppData目录中创建了一个save.dat文件,该文件可以作为python脚本使用,但在使用以下行编译时:
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
功能已完全正常,谢谢您的帮助!