多个Tkinter窗口中的复选按钮
规格:
Python2.7.1
Tkinter(Tk版本8.5)
Windows7
IDLE 2.7.1
我正在编写一个程序,它会“生成”两个窗口,然后把这两个窗口都隐藏,销毁一个窗口,然后显示另一个窗口(这个窗口接着进入主循环)。
这种安排影响了剩下窗口里的一个复选框(Checkbutton)。
比如:
temp = Tk()
temp.withdraw()
root = Tk()
root.withdraw()
temp.destroy()
root.mainloop()
(这看起来有点不寻常,但这样设置是为了让“临时”窗口显示在构建主窗口时出现的问题)。
不过,似乎只要一个程序处理两个Tkinter窗口,
主窗口里的复选框功能就会失效。
def ClickAButton():
print Toggle.get()
Toggle = IntVar()
Checkbutton(root, text = "Me is broke", variable = Toggle).pack()
ClickAButton
Toggle.get()应该在复选框被选中时返回1,否则返回0。
但是,自从添加了新窗口后,Toggle.get总是返回0。
(我尝试过重新格式化代码{这带来了奇怪的错误},
重命名变量等等。
没有“临时”窗口时,复选框工作得很好。)
“临时”窗口在复选框被赋值、打包之前就已经被销毁了,
或者说主窗口根本还没有进入主循环!)
完整示例:
temp = Tk()
temp.withdraw()
root = Tk()
root.withdraw()
if 'certain condition':
root.destroy()
temp.deiconify()
temp.mainloop()
else:
temp.destroy()
Toggle = IntVar()
Checkbutton(root, text = "Why I only return 0?", variable = Toggle).pack()
root.deiconify()
root.mainloop()
出于某种原因,
复选框总是返回0,即使它被选中。
我怀疑这是Tkinter的多线程问题。
我能做些什么呢?
(实际的代码量很大。我不想把所有东西都换成其他的GUI模块)
非常感谢!
(我今年年初才开始编程。
如果我犯了什么低级错误,请多多包涵!)
1 个回答
2
Tkinter这个库并不支持同时打开两个主窗口。我很惊讶你的代码居然能运行。这跟多线程没有关系——Tkinter是单线程的,而且你看起来并没有创建新的线程(不过如果你真的创建了,那可能会导致问题)。
你需要创建一个主窗口,并且只用一个主循环。如果你需要另一个窗口,可以创建一个Toplevel窗口——这个控件就是为了这个目的设计的。