【问题标题】:Is there a way to to bind Python methods to a Tkinter widget through a SEPARATE class?有没有办法通过单独的类将 Python 方法绑定到 Tkinter 小部件?
【发布时间】:2020-11-16 12:17:16
【问题描述】:

有没有办法通过 SEPARATE 类将 Python 方法绑定到 Tkinter 小部件? (即,这些方法与 tkinter 小部件位于不同的类中)?

特别是 Checkbutton() 小部件?

例子:

def __init__(self, master):

    self.var = IntVar()    
    c = Checkbutton(master, text="Enable a tab", variable=self.var, command=self.cb)
    c.pack()
    

def cb(self, event)

    print("Variable is", self.var.get())

...对于第二种方法“cb”——是否可以将它写在与持有 def init(self, master) 构造函数的类不同的类中?

编辑:通过这样做将变量 self.var 传递给 cb 方法:

command=self.cb(self.var)

显然使程序运行不正常。

编辑:问题已得到解答!非常感谢!

【问题讨论】:

  • 是的,通过另一个类的实例。但是如果你想访问这个类的实例变量,你需要将self传递给另一个类的回调。
  • acw1668 - 你能通过代码示例告诉我吗?我想我在上面的编辑说明中解决了这个问题。当我实例化一个对象并尝试通过绑定的 tkinter 方法将此类的实例变量传递给对象时,程序不起作用。

标签: python tkinter


【解决方案1】:

是的,你可以。 command=self.cb(self.var) 的问题是您不能将参数传递给命令中的方法,只能传递方法本身,但您可以使用 lambda 函数解决这个问题,就像在 command=lambda: self.cb(self.var) 中一样。这是一个可重现的小例子:

import tkinter as tk 

class Printer(object):
    def print_text(self, text):
        print(text)

class Button(tk.Button):
    def __init__(self, parent):
        other = Printer()
        super(Button, self).__init__(parent, text='press', command=lambda: other.print_text('test'))

root = tk.Tk()
Button(root).pack()
root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多