Python:为动态创建的单选按钮分配一个函数

时间:2013-01-09 00:21:43

标签: python tkinter

我是python的新手,有一项任务是从列表框中获取输入并为每个条目创建radiobuttons。在我的代码中,我能够创建单选按钮但是当我点击它们时它们不起作用,即在这种情况下它们不打印“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)

请提前帮助和谢谢。

1 个答案:

答案 0 :(得分: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本身,(或lambdapartial或其他),而不是调用它的结果。

例如:

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

由于您在评论中提到:请注意我使用的是partial而不是lambda,因为我希望绑定i的值,而不是关闭变量{{1 }}。否则,您最终将使用例如5个单选按钮绑定到具有值i的同一变量i。还有其他方法 - 使用明确的工厂,做4而不是lambda x=i: hello(x)等。对我来说,lambda: hello(i)似乎是最清晰,最明确的,但你的里程可能会有所不同。无论如何,关于这一点有几十个问题,但Scope of python lambda functions and their parameters的答案似乎特别清楚。