Python ttk.Button - команда, запускается без нажатия кнопки

Я делаю небольшой скрипт на 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:
        ...

Почему-то функция работает без нажатия кнопки. Почему?


person Markus Kothe    schedule 01.06.2010    source источник


Ответы (2)


Маркус, да, это правильное решение, но это не потому, что вы не можете использовать команды с несколькими аргументами в обозначениях виджетов. Представьте, что в исходном коде ...command=loadModelTree(treeModel)... - это вызов метода. Lambda позволяет абстрагироваться от команды, чтобы вы могли иметь произвольное количество аргументов, не запутывая интерпретатор, вызывая его, например, ...command=lambda arg1=myarg1, arg2=myarg2, arg3=myarg3: myCallout(arg1, arg2, arg3)....

Я надеюсь, что это проясняет то, что происходит.

person Bobble    schedule 25.07.2012

Что ж, раз уж я нашел ответ, отвечу на свой вопрос. Примечательно, что команды ttk.button не поддерживают отправку аргументов функциям, поэтому можно обойтись следующим образом:

btReload = ttk.Button(treeBottomUI, text="Reload", width=17, command=lambda i=treeModel: loadModelTree(i))
btReload.pack(side="left")

Просто как пирог!

person Markus Kothe    schedule 01.06.2010