如何将回调函数全局绑定到 tkinter 中的小部件类型?
How to bind callback functions globally to a widget type in tkinter?
我以这样的方式总结了脚本,它只显示了显示我的问题 所必需的内容。简而言之,我想 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()
试试这样:
你试图称呼“自我”。此时你需要一个对象引用。但你没有那个。 Public 个对象仍然可以集成到一个 class。
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()
Tkinter 提供了一个 bind_class
方法,允许您绑定到一个小部件 class 而不是一个单独的小部件。在您的情况下,class 将是 Button
。
您的代码可能如下所示:
root=Tk()
app=Controller(root)
root.bind_class("Button", "<ButtonPress-1>", app.press)
root.bind_class("Button", "<ButtonRelease-1>", app.release)
我以这样的方式总结了脚本,它只显示了显示我的问题 所必需的内容。简而言之,我想 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()
试试这样: 你试图称呼“自我”。此时你需要一个对象引用。但你没有那个。 Public 个对象仍然可以集成到一个 class。
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()
Tkinter 提供了一个 bind_class
方法,允许您绑定到一个小部件 class 而不是一个单独的小部件。在您的情况下,class 将是 Button
。
您的代码可能如下所示:
root=Tk()
app=Controller(root)
root.bind_class("Button", "<ButtonPress-1>", app.press)
root.bind_class("Button", "<ButtonRelease-1>", app.release)