为什么我的窗户在关闭时会重新打开?

时间:2014-10-06 18:32:45

标签: python python-3.x tkinter tk

我正在测试我朋友的Tkinter代码,并发现了这种奇怪的行为。

当我使用Windows“X”按钮(窗口右上角)关闭此Tk窗口(类/方法?)时,它会关闭,然后重新打开一秒钟。再次单击“X”按钮最终会关闭窗口。 这是窗口的代码(假设所有按钮命令都已定义):

from tkinter import *
import os, string, random

def generate():
    length = 13
    chars = string.ascii_letters + string.digits + '!@#$%^&*()'
    random.seed = (os.urandom(1024))
    master = Tk()
    master.title("Secure Password Generator")
    master.geometry("310x24")
    master.maxsize(310,24)
    master.minsize(310,24)
    text = Text(master)
    ranPass = ''
    for i in range(length):
        ranPass += random.choice(chars)
    text.insert(INSERT,"Your secure password is %s." % ranPass)
    text.config(state=DISABLED)
    text.pack()

root = Tk()
root.title ("Sleak Test")
root.geometry("100x500")
app = Frame(root)
app.grid()
button5 = Button(app)
button5.grid()
button5.configure(text = "Password Generator", fg='green', bg='black', command=generate)
root.mainloop()
try:
    root.destroy()
except tkinter.TclError:
    pass

我是否有必要单击窗口上的关闭按钮两次

编辑:让这个例子真正起作用。对不起大家!
第二次编辑:好的,这很奇怪。这非常有效,这意味着其他地方的代码必定存在问题。这很奇怪。

2 个答案:

答案 0 :(得分:1)

这可能是您的问题,也可能不是,但请引用Tkinter Book

  

注意:某些Python开发环境在运行像这样的Tkinter示例时遇到问题。问题通常是环境使用Tkinter本身, mainloop 调用和退出调用与环境的期望相互作用。如果省略明确的销毁调用,其他环境可能会出现异常。如果示例的行为不符合预期,请检查开发环境的特定于Tkinter的文档。

     

...

     

只有在某些开发环境下运行此示例时才需要 destroy 调用;它在事件循环终止时明确地销毁主窗口。除非这样做,否则某些开发环境不会终止Python进程。

这意味着,如果您从IDLE或其他基于tkinter的IDE中启动应用程序,或者在Windows上,在某些情况下,从任何图形IDE启动应用程序 - 您可能必须添加{ {1}}之后的{1}}。

如果您怀疑这可能是问题,并且您正在使用IDE,那么首先要测试的是在IDE之外运行问题。打开cmd.exe(" DOS提示符")窗口,然后执行以下操作:

root.destroy()

如果它现在正常工作,这很可能是问题所在。所以下一步是添加root.mainloop()并确保它从命令行和IDLE都正常工作。

但是,请注意,在某些情况下,这将导致tkinter引发并捕获异常并记录有关它的虚假错误消息。如果您要构建分发应用程序,则可能需要执行以下操作:

cd C:\Path\To\Your\Program
C:\Path\To\Python\pythonw.exe YourScript.py

答案 1 :(得分:0)

没关系,我修好了。感谢@abarnert的帮助。

如果有人想知道这一点,我的朋友忘记在root.destroy()电话后拨打root.mainloop()电话。虽然包含此destroy()方法会在IDLE中抛出_tkinter.TclError,但它在编译时确实可以正常工作。

非常感谢。

重新编辑:好的,我现在明白了。事实证明,我的朋友正在导入tkinterTkinter模块,由于Python 2.7安装,我同时拥有这两个模块。这意味着该程序试图调用每个Tkinter相关的函数两次
做得好我。