0

我是 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)

请提前帮助和感谢。

4

1 回答 1

1

问题是您在hello(i)构建时调用Radiobutton,而不是存储稍后调用的内容:

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

由于hello退货None,您有效地存储了command=None.

您需要在此处存储一个可调用对象,例如hello其自身(或 a lambdaorpartial或其他),而不是调用它的结果。

例如:

    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具有 value的同一个变量4。还有其他方法可以解决这个问题 - 使用显式工厂,dolambda x=i: hello(x)代替lambda: hello(i)等。对我来说,partial这似乎是最清晰和最明确的,但你的里程可能会有所不同。无论如何,关于这个有几十个问题,但是python lambda函数及其参数的范围的答案似乎特别清楚。

于 2013-01-09T00:31:07.880 回答