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

Atristamez

因此,我使用tkinter创建了一种计算器,并进行了快速设置,从而在AppData目录中创建了一个save.dat文件,该文件可作为python脚本使用,但是使用该行编译时:
pyinstaller --onefile -w file.py不起作用。exe运行安装过程就好了,但现在看来,一些测试后,当它到达if语句的结束,如果save.dat已经存在(出现一个对话框,并有一个不再显示复选框和一个OK按钮),它不等待响应并关闭。当我检查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()

AST

有几处更改,请参考下面的更新代码

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)
    os.chdir(path)
    os.makedirs(appdir)
    loc = os.path.expanduser(pref_file)
    new = "0"
    pickle.dump(new, open(loc, "wb"))
    
popup = Tk()
popup.withdraw()

appdata=os.getenv('APPDATA') #modified for my convenience
appdir=os.path.join(appdata,'MyApp')
pref_file=os.path.join(appdir,'pref.pickle')
loc = os.path.expanduser(pref_file)

if (os.path.exists(loc)):

    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())
            btnOK = Button(popup, text="OK", bg="#f0f0f0", justify="center", width=20,command=lambda:btnOkay()).grid()
            def btnOkay():
                global i
                lbl = Label(popup, text=var.get())
                if (var.get() == "0"):
                    popup.withdraw()
                    i = "1"
                    #calc.deiconify()
                    print('deiconified calc') #added for debugging
                
                elif (var.get() == "1"):
                    
                    info = open(loc, 'w+')
                    new = "1"
                    pickle.dump(new, open(loc, "wb"))
                    popup.withdraw()
                    #calc.deiconify()
                    print('deiconified calc') #added for debugging
                    i = "1"
                    world()
                    popup.deiconify()

        elif i == "1":
            #calc.deiconify() commented for debugging
            print('deiconified calc')
            exit() #added for debugging

    i = pickle.load(open(loc, "rb"))
    world()

else:
    saving()
    messagebox.showinfo("Setup Complete", "Setup is now complete. Please restart the program to continue.")
    sys.exit()

popup.mainloop()

笔记

  • mainloop()的程序没有,因为它的窗口永远不会显示。
  • world()在这种if情况下,没有对函数的初始调用
  • 不要world()elif i == "1":条件中调用,这将导致无限递归。

对于您要实现的目标,我仍然不太清楚,请告诉我我的代码是否满足您的要求。希望能有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用tkinter窗口时隐藏python shell

来自分类Dev

Python and Tkinter

来自分类Dev

单击Python时的Tkinter救济按钮

来自分类Dev

Python:导入的Tkinter程序会自行运行吗?

来自分类Dev

如何在启动时运行python程序(包含tkinter)

来自分类Dev

Python Tkinter-成功从顶级继承

来自分类Dev

Tkinter框架无法正确居中(Python)

来自分类Dev

预设函数时,Python tkinter标签移动

来自分类Dev

从python GUI tkinter运行linux终端命令

来自分类Dev

Python Tkinter Crashing,除了程序继续运行?Tkinter的最终抛光

来自分类Dev

使用tkinter窗口时隐藏python shell

来自分类Dev

暂停Python Tkinter程序

来自分类Dev

Python:使用Tkinter时脚本未退出

来自分类Dev

Python 3.2 Cx_Freeze无法编译整个tkinter

来自分类Dev

将Python 3.4代码编译成EXE吗?

来自分类Dev

单击python时的Tkinter救济按钮

来自分类Dev

关闭Tkinter Python程序时发生异常

来自分类Dev

Python Tkinter画布运行缓慢

来自分类Dev

Python Tkinter程序崩溃时忘记了()

来自分类Dev

Python Tkinter GUI无法正确显示

来自分类Dev

gradle编译成功,但无法运行项目

来自分类Dev

Tkinter mainloop()未运行-Python

来自分类Dev

Python Tkinter运行检查按钮

来自分类Dev

python tkinter问题运行命令

来自分类Dev

python 3.5 tkinter gui程序

来自分类Dev

Python 在销毁 Tkinter 窗口时崩溃

来自分类Dev

Python tkinter IntVars 未正确设置

来自分类Dev

PyCharm 在单击按钮时冻结 - Python/Tkinter

来自分类Dev

paho mqtt:使用 python 3 编译时输出不正确