在 Tkinter 中绑定:完整指南

在本文中,我们尝试了解 Tkinter 中使用的绑定概念。在开始本主题之前,我们必须记住Python的Tkinter包用于设计基于GUI的界面。Tkinter 具有各种内置功能和扩展,可用于增强应用程序的功能和性能。

什么是绑定?

结合这个词的基本定义是粘在一起或导致粘在一起形成一个整体。类似地,Tkinter 绑定用于连接小部件中传递的事件以及事件处理程序。事件处理程序是事件发生时调用的函数。

widget.bind(sequence=None, func=None, add=None)

该 sequence 参数描述了我们期望的事件,而 func 参数是当该事件发生在小部件上时要调用的函数。如果此小部件已存在该事件的绑定,通常旧回调会替换为func,但您可以通过传递 来保留这两个回调 add='+'

可以使用不同级别的绑定函数将事件绑定到事件处理程序。

1.实例级绑定

人们可以将事件绑定到一个特定的小部件。要绑定小部件的事件,请调用 .bind() 该小部件上的方法。

widget.bind(event, event handler)
  • 事件 – 由用户引起的可能反映更改的事件。
  • 事件处理程序 – 应用程序中的函数,在事件发生时调用。
  • 绑定 – 配置一个事件处理程序(Python 函数),当小部件发生事件时调用该事件处理程序。

以下是如何将事件绑定到小部件的特定实例的示例。

import tkinter as tk
class Display:
    def __init__(self):
        self.root = tk.Tk()
        self.entry1 = tk.Entry(self.root)
        self.entry1.bind("<KeyPress>", self.onKeyPress)
        self.entry1.pack()
        self.root.mainloop()
 
    def onKeyPress(self, event):
        print("Key has been Pressed.")
display = Display()

输出

执行

多重绑定

如果我们需要将多个函数绑定到一个特定的小部件怎么办?传递两个包含该函数的语句 bind the 肯定不起作用,因为第二个语句将覆盖第一个语句,因此只会调用第二个函数,如下所示

执行

add通过向使用该函数的第二条语句添加一个额外参数即可解决此问题bind另外不要忘记分配 add=”+”。这将调用这两个函数。因此我们可以在 Tkinter 中启用多重绑定。

执行

2. 类级绑定

可以将事件绑定到一类的所有小部件。例如,您可以将所有小部件设置 Button 为通过在英语和日语标签之间来回更改来响应鼠标中键单击。要将事件绑定到类的所有小部件,请 .bind_class() 在任何小部件上调用该方法。

中提到的“类”  bind_class 是指tk库使用的内部类名,而不是python类名。bind_class 是所有小部件都可用的方法,只需再次调用 Tk 绑定命令,但不使用实例名称,而是使用小部件类名称。

w.bind_class(className, sequence=None, func=None, add=None)

的基本工作原理.bind_class与函数相同.bind

例如,假设您有多个同一类的小部件,这里假设我们有多个条目小部件,并且需要将它们全部设置为相同的函数。您不必调用 .bind() 其中的每一个,而是可以通过一次调用将它们全部设置起来,如下所示:

from tkinter import *
import tkinter as tk
 
class Display:
    def __init__(self):
        self.root = tk.Tk()
        self.entry_username = tk.Entry(self.root)
        self.entry_birthday = tk.Entry(self.root)
        self.entry_password= tk.Entry(self.root)
        self.entry_username.bind_class("Entry", "<Return>", self.onReturn)
 
        self.entry_username.pack()
        self.entry_birthday.pack()
        self.entry_password.pack()
 
        #to know the class type of the widget use following command.
        #print(self.entry_username.winfo_class())
        self.root.mainloop()
 
    def onReturn(self, event):
        print("Return pressed")
display = Display()

输出

执行

3. 应用级绑定

人们可以设置一个绑定,以便无论哪个小部件具有焦点或位于鼠标下方,某个事件都会调用处理程序。

w.bind_all(sequence=None,  func=None,  add=None)

与 类似 .bind(),但适用于整个应用程序中的所有小部件。

例如,您可能在整个程序中有多个相同类型的小部件,它们属于不同类的一部分。要在应用程序级别绑定事件,请 .bind_all() 在任何小部件上调用该方法。使用 .bind_all 时,您不需要提及类名,因为绑定应用于应用程序的每个事件。以下是如何实现它,

from tkinter import *
import tkinter as tk
 
class Display:
    def __init__(self):
        self.root = tk.Tk()
        self.entry_username = tk.Entry(self.root)
        self.entry_birthday = tk.Entry(self.root)
        self.entry_password = tk.Entry(self.root)
        self.entry_username.bind_all("<Return>", self.onReturn)
 
        self.entry_username.pack()
        self.entry_birthday.pack()
        self.entry_password.pack()
 
        #to know the class type of the widget use following command.
        print(self.entry_username.winfo_class())
        self.root.mainloop()
 
    def onReturn(self, event):
        print("Return pressed")
display = Display()

输出

执行

概括

在本文中,我们了解了 Bind 是 Tkinter 中使用的函数,用于将事件与称为小部件事件处理程序的特定函数连接或关联。此外,Tkinter 支持三种级别的绑定:实例级绑定、类级绑定和应用程序级绑定。

参考

https://web.archive.org/web/20190514010732id_/http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html