我是一个使用tkinter库的新手,我不知道如何将参数从一个组合框传递到我想要绑定到事件操作上的方法?
示例:
class Controller():
def __init__(self):
self.root = tk.Tk()
self.view = View(self.root)
self.view.sidepanel.motor_sel_combo.bind("<<ComboboxSelected>>", lambda event, arg=self.view.sidepanel.motor_sel_combo.get(): self.motor_selection(event, arg))
def motor_selection(self,event, mot_selected):
#print(event) #--> would only print <VirtualEvent event x=0 y=0> #????
#print(event.widget.get())
print(mot_selected)
print(mot_selected)
的输出为空。平纹机手册没有给出一个很好的例子。
self.view.sidepanel.motor_sel_combo.get()
包含imho,即组合框的选定值。
我也尝试过使用functools.partial
而不是lambda
,但是我没有让它开始工作。请给我看一下lambda
和functools.partial
的正确语法好吗?谢谢。
发布于 2022-08-04 15:29:05
您在创建lambda时调用self.view.sidepanel.motor_sel_combo.get()
,而不是在combobox值更改时调用它。
您应该在函数中调用get()
方法,而不是试图将它传递给函数。在这里使用lambda
只会使代码变得不必要的复杂。
class Controller():
def __init__(self):
self.root = tk.Tk()
self.view = View(self.root)
self.view.sidepanel.motor_sel_combo.bind("<<ComboboxSelected>>",
self.motor_selection)
def motor_selection(self,event):
mot_selected = self.view.sidepanel.motor_sel_combo.get()
...
@ and 1668在评论中指出,函数应该使用event.widget.get()
而不是self.view.sidepanel.motor_sel_combo.bet()
,这是正确的。由于我们希望在绑定的小部件上调用get()
,所以使用更短的版本是更好的解决方案。它更好的原因有两个:因为它使函数松耦合到其他代码,以及因为它使函数更清楚地操作在它绑定到的小部件上。这意味着其他代码可以重命名该变量,并且函数将继续工作,而不必进行修改。
对于这么小的程序来说,函数是松散耦合的还是紧密耦合的,都不是什么大问题。不过,我认为在回调中使用event.widget
是一个最佳实践,应该养成这样做的习惯。
OP在注释中表示,他们希望看到一个使用lambda
的版本。我不推荐它,但是lambda
问题的根源在于OP在定义lambda
时调用了get()
方法,而不是在调用它时。要在运行get()
方法时调用lambda
方法,必须将调用移动到主体内:
self.view.sidepanel.motor_sel_combo.bind(
"<<ComboboxSelected>>",
lambda event: self.motor_selection(event, self.view.sidepanel.motor_sel_combo.get())
)
在这种情况下,motor_selection
必须与OP的原始代码类似,并接受两个参数。
https://stackoverflow.com/questions/73238441
复制相似问题