我是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)
请提前帮助和谢谢。
答案 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
本身,(或lambda
或partial
或其他),而不是调用它的结果。
例如:
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的答案似乎特别清楚。