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