多个Tkinter窗口中的复选按钮

0 投票
1 回答
870 浏览
提问于 2025-04-16 21:41

规格:
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窗口——这个控件就是为了这个目的设计的。

撰写回答