为什么在这段代码中,当单击一个按钮时,打开一个新窗口时,所有的单选按钮都会被选中?
class CodeButton:
def __init__(self, root):
self.btn = Button(root, text="Code",width=20, height=1,bg="white", fg="black")
self.btn.bind("<Button-1>", make_code_window)
self.btn.pack()
def make_code_window(event):
new_root = Toplevel()
new_root.minsize(width=300, height=300)
var = IntVar()
var.set(0)
for i in range(8):
Radiobutton(new_root, text=str(i), variable=var, value=i).pack()
def main():
root = Tk()
root.minsize(width=400, height=250)
CodeButton(root)
root.mainloop()
发布于 2017-04-29 14:38:49
(跟进我们在https://stackoverflow.com/a/43700864/355230评论部分进行的讨论。)
是的,将IntVar
作为参数传递给事件处理程序函数有点棘手--实际上它有时被称为http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/extra-args.html。;-)
下面是一个将其应用于代码的示例:
try:
from tkinter import *
except ImportError: # Python 2
from Tkinter import *
class CodeButton:
def __init__(self, root):
self.btn = Button(root, text="Code",width=20, height=1,bg="white", fg="black")
self.btn.bind("<Button-1>",
# Extra Arguments Trick
lambda event, var=root.var: make_code_window(event, var))
self.btn.pack()
def make_code_window(event, var): # note added "var" argument
new_root = Toplevel()
new_root.minsize(width=300, height=300)
var.set(-99) # deselect by using value not associated with any RadioButtons
for i in range(8):
Radiobutton(new_root, text=str(i), variable=var, value=i).pack()
def main():
root = Tk()
root.minsize(width=400, height=250)
root.var = IntVar() # create it here to give access to it in the rest of your code
CodeButton(root)
root.mainloop()
main()
发布于 2017-04-29 13:58:20
这与将IntVar
存储在函数中的局部变量中有关,一旦make_code_window()
函数返回,该函数将被丢弃。您可以通过使IntVar
成为new_root
窗口小部件的一个属性来解决这个问题,因此只要使用它的小部件存在,它就会存在。
您的示例中的代码不太现实,因为通常人们希望在Python代码中的其他地方使用IntVar
的当前值,但这是不可能的,因为它只是暂时存储在局部变量中,而局部变量只存在于创建它的函数执行过程中。
try:
from tkinter import *
except ImportError: # Python 2
from Tkinter import *
class CodeButton:
def __init__(self, root):
self.btn = Button(root, text="Code",width=20, height=1,bg="white", fg="black")
self.btn.bind("<Button-1>", make_code_window)
self.btn.pack()
def make_code_window(event):
new_root = Toplevel()
new_root.minsize(width=300, height=300)
var = new_root.var = IntVar() # changed
var.set(0)
for i in range(8):
Radiobutton(new_root, text=str(i), variable=var, value=i).pack()
def main():
root = Tk()
root.minsize(width=400, height=250)
CodeButton(root)
root.mainloop()
main()
https://stackoverflow.com/questions/43700585
复制