Python:将函数分配给动态创建的单选按钮

Python:将函数分配给动态创建的单选按钮,python,tkinter,Python,Tkinter,我是python新手,我的任务是从列表框中获取输入,并为每个条目创建单选按钮。在我的代码中,我可以创建单选按钮,但当我单击它们时,它们不起作用,即在这种情况下,它们不会打印“hello”和数字I。代码如下: def generateGraph(): w = Toplevel(bg = "grey") w.resizable(0,0) frameData = Frame(w, bg="grey", padx=10, pady=10) frameData.grid(r

我是python新手,我的任务是从列表框中获取输入,并为每个条目创建单选按钮。在我的代码中,我可以创建单选按钮,但当我单击它们时,它们不起作用,即在这种情况下,它们不会打印“hello”和数字I。代码如下:

def generateGraph():
    w = Toplevel(bg = "grey")
    w.resizable(0,0)
    frameData = Frame(w, bg="grey", padx=10, pady=10)
    frameData.grid(row = 0, column=0, pady = 1, padx = 1, sticky = N+E+S+W)
    InputLabel = Label(frameData, text="Inputs:", bg="grey")
    InputLabel.grid(row=1, column=0, padx=10, sticky=N+E+S+W)
    OutputLabel = Label(frameData, text="Outputs:", bg="grey")
    OutputLabel.grid(row=1, column=1, padx=10, sticky=N+E+S+W)

    i=0
    c=[]
    inputVar = IntVar()
    while(InputBox.get(i)):
        c.append(Radiobutton(frameData, text=InputBox.get(i), variable=inputVar, value = i, background="grey", command= hello(i)))
        c[i].grid(row = i+2, column = 0, sticky = W)
        i=i+1
    if makemodal:
        w.focus_set()
        w.grab_set()
        w.wait_window()
def hello(i):
    print("hello %d" %i)

请提前帮助和感谢。

问题在于,在构建
单选按钮时,您正在呼叫
hello(i)
,而没有存储稍后要调用的内容:

    c.append(Radiobutton(frameData, text=InputBox.get(i), variable=inputVar, value = i, background="grey", command= hello(i)))
由于
hello
返回
None
,因此有效地存储了
command=None

您需要在此处存储一个可调用项,比如
hello
本身(或
lambda
partial
等),而不是调用它的结果

例如:

    c.append(Radiobutton(frameData, text=InputBox.get(i), 
                         variable=inputVar, value = i, background="grey",
                         command=functools.partial(hello, i)))

由于您在注释中询问:请注意,我使用了
partial
而不是
lambda
,因为我希望绑定
I
的值,而不是关闭变量
I
。否则,您将得到5个单选按钮,所有按钮都绑定到同一个变量
i
,值为
4
。还有其他方法可以使用显式工厂,使用
lambda x=i:hello(x)
而不是
lambda:hello(i)
等。对我来说,
partial
似乎是最清晰和最显式的,但您的里程可能会有所不同。无论如何,关于这一点有几十个问题,但答案似乎特别清楚。

这不是你的第一篇文章-记住要正确缩进你的文章,并确保应该在代码块中的所有内容都是isDone。非常感谢。你知道我们怎么做吗?这不是你的问题(见我的答案),但是:你为什么要把
命令
附加到
单选按钮
?这不是典型的UI行为。通常情况下,单选按钮用于选择一个值,该值将在以后的其他操作中使用。附带说明:通常情况下,131个字符的长行是不好的样式,但当您发布SO时,这一点尤其正确,这将迫使任何人使用水平滚动条来查看您的代码。谢谢。但现在的问题是,我如何知道单击了哪个单选按钮?i、 e.现在,每当单击任何按钮时,它都会打印最后更新的i值。是的,因为您正在为所有在同一
i
变量上关闭的
Radiobutton
创建lambda。关于这一点,有几十个问题,比如,将告诉你如何做正确的事情。谢谢。我来看看。:)@维希什:我以我个人的方式编辑了答案。如果这对你有意义,那太好了。但大多数不认为“部分评估就是我想要的”的人不会理解为什么它是正确的答案,因此值得了解为什么会发生这种情况,以及不同的解决方案是如何工作的。