Python ttk.Button -command,未按按钮也会执行
我正在用Python和ttk写一个小脚本,但遇到了一个问题:一个函数在不该运行的时候却运行了。按钮的代码如下:
btReload = ttk.Button(treeBottomUI, text="Reload", width=17, command=loadModelTree(treeModel)) btReload.pack(side="left")
而这个函数是这样的:
def loadModelTree(tree): print ("Loading models...") allModels = os.listdir(confModPath) for chunk in allModels: ...
不知道为什么,这个函数在按钮没有被按的时候就运行了。为什么会这样呢?
2 个回答
1
好吧,既然我找到了答案,那我就自己来回答这个问题。
看起来,ttk.button 的命令不支持给函数传递参数,所以解决这个问题的方法是这样做:
btReload = ttk.Button(treeBottomUI, text="Reload", width=17, command=lambda i=treeModel: loadModelTree(i)) btReload.pack(side="left")
简单得很!
2
Markus,是的,你的解决方案是对的,但并不是因为你不能在小部件的调用中使用多个参数的命令。想想你原来的代码,...command=loadModelTree(treeModel)...
其实是一个方法的调用。使用 Lambda 表达式可以让你把命令抽象出来,这样你就可以传入任意数量的参数,而不会让解释器感到困惑,比如 ...command=lambda arg1=myarg1, arg2=myarg2, arg3=myarg3: myCallout(arg1, arg2, arg3)...
。
我希望这样能让你对发生了什么有更清楚的理解。