当另一个tkinter打开时,单选按钮行为异常

时间:2019-01-09 13:05:48

标签: python-3.x tkinter

使用Python Tkinter时,为什么打开的窗口会更改其他窗口中单选按钮的行为?

#!/usr/bin/env python3

import tkinter as tk

def close_button():
    raise SystemExit

# open first window
root1 = tk.Tk()

# open second window and display radio buttons
root2 = tk.Tk()
root2.protocol('WM_DELETE_WINDOW', close_button)
var = tk.IntVar()
var.set(1)
tk.Radiobutton(root2, variable = var, value = 1).pack()
tk.Radiobutton(root2, variable = var, value = 2).pack()
tk.Radiobutton(root2, variable = var, value = 3).pack()
tk.Button(root2, text = 'print selection', command = lambda : print(var.get())).pack()

root1.mainloop()
root2.mainloop()

此程序将打开与root1root2对应的两个窗口。这是第二个窗口的样子。

greyed out radio buttons

如果我单击任意一个单选按钮,则灰点消失,如下所示。

misbehaving radio buttons

但是,无论选择什么,单击print selection按钮都会显示'1'!

另一方面,如果未创建root1,则单选按钮不会出现异常。

no errors

单击print selection会打印正确的值:'1','2'或'3',具体取决于选择的是三个。

所以,我的问题是:root2的单选按钮为什么在打开另一个窗口root1时出现异常? (我在程序中使用类,但在此示例中,我将其简化为最低限度。)

由于我的应用程序需要同时打开两个窗口,因此无法在root1.mainloop()下方写上root1 = tk.Tk()语句。

1 个答案:

答案 0 :(得分:3)

您永远不会在应用程序中两次使用Tk()。相反,您需要将单个根窗口与Tk()一起使用,此后的每个新窗口都需要使用Toplevel()

执行此操作:

#!/usr/bin/env python3
import tkinter as tk


def close_button():
    raise SystemExit

root = tk.Tk()
top = tk.Toplevel(root)
top.protocol('WM_DELETE_WINDOW', close_button)
var = tk.IntVar()
var.set(1)

tk.Radiobutton(top, variable=var, value=1).pack()
tk.Radiobutton(top, variable=var, value=2).pack()
tk.Radiobutton(top, variable=var, value=3).pack()
tk.Button(top, text='print selection', command=lambda : print(var.get())).pack()
root.mainloop()