我正在测试我朋友的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
我是否有必要单击窗口上的关闭按钮两次?
编辑:让这个例子真正起作用。对不起大家!
第二次编辑:好的,这很奇怪。这非常有效,这意味着其他地方的代码必定存在问题。这很奇怪。
答案 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
,但它在编译时确实可以正常工作。
非常感谢。
重新编辑:好的,我现在明白了。事实证明,我的朋友正在导入tkinter
和Tkinter
模块,由于Python 2.7
安装,我同时拥有这两个模块。这意味着该程序试图调用每个Tkinter
相关的函数两次。
做得好我。