Python Tkinter:选择所有单选按钮
为什么在这段代码中,当新窗口打开时单击按钮时,所有单选按钮都被选中Python Tkinter:选择所有单选按钮,python,tkinter,Python,Tkinter,为什么在这段代码中,当新窗口打开时单击按钮时,所有单选按钮都被选中 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
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()
class代码按钮:
定义初始化(自,根):
self.btn=按钮(根,text=“Code”,宽度=20,高度=1,bg=“白色”,fg=“黑色”)
self.btn.bind(“,生成代码\u窗口)
self.btn.pack()
def生成代码窗口(事件):
新根=顶级()
新建_root.minsize(宽度=300,高度=300)
var=IntVar()
变量集(0)
对于范围(8)中的i:
Radiobutton(new_root,text=str(i),variable=var,value=i).pack()
def main():
root=Tk()
root.minsize(宽度=400,高度=250)
代码按钮(根)
root.mainloop()
这与将IntVar
存储在函数的局部变量中有关,该变量将在make\u code\u window()函数返回时立即丢弃。您可以通过使IntVar
成为new\u 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()
试试看:
从tkinter进口*
除此之外:#Python 2
从Tkinter进口*
类别代码按钮:
定义初始化(自,根):
self.btn=按钮(根,text=“Code”,宽度=20,高度=1,bg=“白色”,fg=“黑色”)
self.btn.bind(“,生成代码\u窗口)
self.btn.pack()
def生成代码窗口(事件):
新根=顶级()
新建_root.minsize(宽度=300,高度=300)
var=new_root.var=IntVar()#已更改
变量集(0)
对于范围(8)中的i:
Radiobutton(new_root,text=str(i),variable=var,value=i).pack()
def main():
root=Tk()
root.minsize(宽度=400,高度=250)
代码按钮(根)
root.mainloop()
main()
(我们在我的演讲的评论部分进行了后续讨论。)
是的,将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>",
# 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()
试试看:
从tkinter进口*
除此之外:#Python 2
从Tkinter进口*
类别代码按钮:
定义初始化(自,根):
self.btn=按钮(根,text=“Code”,宽度=20,高度=1,bg=“白色”,fg=“黑色”)
self.btn.bind(“,
#额外参数技巧
lambda事件,var=root.var:make_code_window(事件,var))
self.btn.pack()
def make_code_窗口(事件,变量):#注意添加了“var”参数
新根=顶级()
新建_root.minsize(宽度=300,高度=300)
var.set(-99)#使用与任何单选按钮不关联的值取消选择
对于范围(8)中的i:
Radiobutton(new_root,text=str(i),variable=var,value=i).pack()
def main():
root=Tk()
root.minsize(宽度=400,高度=250)
root.var=IntVar()#在此处创建它,以便在代码的其余部分中访问它
代码按钮(根)
root.mainloop()
main()
如何避免这种情况?@abccd:这是一个错误的评估。对于单选按钮,您应该使用一个变量。这就是为什么它们的行为像一个RadioButton(非常感谢你:)我只是一个学生,正在尝试为我的项目创建gui,在这种情况下,保存变量值而不是本地值的好方法是什么?如果你不介意的话,最简单的方法就是将IntVar
作为一个全局变量。避免使用全局变量的更好方法可能会更复杂一些,这就是为什么许多人不费心的原因。也许我发布了另一个答案……我试图将变量与事件一起传递,但这并不容易。这是我第一次使用GUI