2010-06-01 5 views
1

Я создаю небольшой скрипт в python с ttk, и у меня есть проблема, когда функция запускается там, где она не должна. Код кнопки выглядит следующим образом:Python ttk.Button -команда работает без нажатия кнопки

 
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: 
     ... 

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

ответ

1

Ну, как я нашел ответ, я отвечу на свой вопрос. Это appers, что команды 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)....

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

Смежные вопросы