使用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()
此程序将打开与root1
和root2
对应的两个窗口。这是第二个窗口的样子。
如果我单击任意一个单选按钮,则灰点消失,如下所示。
但是,无论选择什么,单击print selection
按钮都会显示'1'!
另一方面,如果未创建root1
,则单选按钮不会出现异常。
单击print selection
会打印正确的值:'1','2'或'3',具体取决于选择的是三个。
所以,我的问题是:root2
的单选按钮为什么在打开另一个窗口root1
时出现异常? (我在程序中使用类,但在此示例中,我将其简化为最低限度。)
由于我的应用程序需要同时打开两个窗口,因此无法在root1.mainloop()
下方写上root1 = tk.Tk()
语句。
答案 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()