【问题标题】:How to bind callback functions globally to a widget type in tkinter?如何将回调函数全局绑定到 tkinter 中的小部件类型?
【发布时间】:2021-11-22 14:50:12
【问题描述】:

我已经对脚本进行了总结,它只显示了显示我的问题所必需的内容。总之,我想globally将回调函数绑定到app中所有button类型的小部件。

class Frame_1(Frame):
    def__init__(self,master, **kwargs):
        super().__init__(master, **kwargs)
        self.btn_0 = Button(self, text='Press 10')
        self.btn_0 .pack() #...

        # links that I would like to disappear 
        # and replace with a global link that only reaches button type widgets
        self.btn_0 .bind('<ButtonPress>', self.master.press)
        self.btn_0 .bind('<ButtonRelease>', self.master.release)


class Frame_2(Frame):
    def__init__(self,master, **kwargs):
        super().__init__(master, **kwargs)
        self.btn_0 = Button(self, text='Press 10')
        self.btn_0 .pack() #....
        self.btn_0 .bind('<ButtonPress>', self.master.press)
        self.btn_0 .bind('<ButtonRelease>', self.master.release)


class Controller(Frame):
    def__init__(self,master, **kwargs):
        super().__init__(master, **kwargs)
        self.frm1 = Frame_1(self, bg='blue')
        self.frm1 .pack()
        self.frm2 = Frame_2(self, bg='green')
        self.frm2 .pack()

    def press(self, e):
        print('press')
    def release(self, e):
        print('release')
        

root=Tk()
app=Controller(root)
app.pack()
root.mainloop()

【问题讨论】:

  • 全球范围内?您将不得不使用 3rd 方库。这回答了你的问题了吗? python tkinter - Bind a "Global" key shortcut which can be triggered from outside the window
  • 感谢您的回答,我打算不重复代码bind ('&lt;ButtonPress&gt;', callback) bind ('&lt;ButtonRelease&gt;', callback),因为这样做似乎很原始,因为如果有某种方法可以不重复,我想知道的,一直在想bind_classbind_all,但是不知道怎么应用
  • bind_class 适用于特定的小部件类,例如如果将其应用于按钮,则绑定将应用于所有按钮
  • @CoolCloud 但是我应该如何实现呢?如果您能帮我一点忙,我将不胜感激。
  • self.bind_class('Button', '&lt;ButtonPress&gt;',self.master.press) 等等...

标签: python tkinter binding


【解决方案1】:

试试这个方法: 你试图称呼“自我”。此时您需要一个对象引用。但你没有那个。公共对象仍然可以集成到一个类中。

from tkinter import *


def press( event):
    print('press')

def release( event):
    print('release')


class Frame_1(Frame):
    def __init__(self, master, **kwargs):
        super().__init__(master, **kwargs)

        self.btn_0 = Button(self, text='Press 10')
        self.btn_0.pack()  # ...

        # links that I would like to disappear
        # and replace with a global link that only reaches button type widgets
        self.btn_0.bind('<ButtonPress>', press)
        self.btn_0.bind('<ButtonRelease>', release)


class Frame_2(Frame):
    def __init__(self, master, **kwargs):
        super().__init__(master, **kwargs)
        self.btn_0 = Button(self, text='Press 10')
        self.btn_0.pack()  # ....
        self.btn_0.bind('<ButtonPress>',  press)
        self.btn_0.bind('<ButtonRelease>', release)


class Controller(Frame):
    def __init__(self, master, **kwargs):
        super().__init__(master, **kwargs)
        global press, release
        self.frm1 = Frame_1(self, bg='blue')
        self.frm1.pack()
        self.frm2 = Frame_2(self, bg='green')
        self.frm2.pack()



root = Tk()
app = Controller(root)
app.pack()
root.mainloop()

【讨论】:

  • 虽然你的建议让我怀疑我使用的结构是否不够,但它并没有解决我不重复每个按钮的代码的问题,因为按钮很多,必须有一些方法不要重复每个链接。我很欣赏这个建议。
【解决方案2】:

Tkinter 提供了一个bind_class 方法,允许您绑定到一个小部件类而不是单个小部件。在您的情况下,该类将是 Button

您的代码可能如下所示:

root=Tk()
app=Controller(root)

root.bind_class("Button", "<ButtonPress-1>", app.press)
root.bind_class("Button", "<ButtonRelease-1>", app.release)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多