Python ttk.Button -command,未按按钮也会执行

1 投票
2 回答
3600 浏览
提问于 2025-04-15 23:23

我正在用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)...

我希望这样能让你对发生了什么有更清楚的理解。

撰写回答