首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tkinter:当<<ComboboxSelected>>绑定到一个方法时,如何传递参数?

tkinter:当<<ComboboxSelected>>绑定到一个方法时,如何传递参数?
EN

Stack Overflow用户
提问于 2022-08-04 15:21:21
回答 1查看 54关注 0票数 0

我是一个使用tkinter库的新手,我不知道如何将参数从一个组合框传递到我想要绑定到事件操作上的方法?

示例:

代码语言:javascript
运行
复制
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,但是我没有让它开始工作。请给我看一下lambdafunctools.partial的正确语法好吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 15:29:05

您在创建lambda时调用self.view.sidepanel.motor_sel_combo.get(),而不是在combobox值更改时调用它。

您应该在函数中调用get()方法,而不是试图将它传递给函数。在这里使用lambda只会使代码变得不必要的复杂。

代码语言:javascript
运行
复制
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方法,必须将调用移动到主体内:

代码语言:javascript
运行
复制
self.view.sidepanel.motor_sel_combo.bind(
    "<<ComboboxSelected>>",  
    lambda event: self.motor_selection(event, self.view.sidepanel.motor_sel_combo.get())
)

在这种情况下,motor_selection必须与OP的原始代码类似,并接受两个参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73238441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档