绑定方法在Python Tkinter中的应用
在以下教程中,我们将讨论在Python编程语言中Tkinter中使用的绑定概念。但是,在开始这个话题之前,我们必须记住,Python的Tkinter包用于基于图形用户界面(GUI)设计界面。Tkinter具有广泛的内置功能和扩展,可以利用它们来提高应用程序的总体性能和功能。
理解绑定
“绑定(bind)”这个词的基本定义是把东西粘在一起或使其黏在一起成为一个整体。同样地,Tkinter的bind()方法用于将传递给部件的事件与事件处理程序连接在一起。事件处理程序是发生事件时调用的函数。
现在让我们考虑Tkinter的bind()方法的语法:
语法 :
# syntax of Tkinter's bind() function
widget_name.bind(sequence = None, func = None, add = None)
其中,sequence表示我们期望的事件类型,func参数用于定义当该事件发生在部件上时要调用的函数。如果这个部件已经有绑定了该事件的调用回调函数,那么旧的回调函数将被替换为func;但是,我们可以通过传递add=’+’来保留两个回调函数。
我们可以利用bind()方法在不同级别上将事件绑定到事件处理程序。
- 实例级别绑定
- 类级别绑定
- 应用程序级别绑定
实例级别绑定
我们可以将一个事件绑定到特定的小部件上。为了绑定小部件的事件,我们需要在该小部件上调用bind()方法。
语法 :
# syntax of Tkinter's bind() method
widget_name.bind(event, event_handler)
参数 :
- event:event参数用于定义由用户引起的可能反映改变的事件。
- event_handler:event_handler参数用于描述应用程序中在事件发生时调用的函数。
- bind:bind方法将配置一个事件处理程序(Python函数),当部件发生事件时调用。
让我们来看一个示例,说明如何将事件绑定到特定小部件实例上。
例子 :
# importing the tkinter module
import tkinter as tk
# defining the class to build GUI
class DisplayWindow:
# defining an initializing function
def __init__(self):
# creating a window
self.gui_root = tk.Tk()
# configuring the size and position of the window
self.gui_root.geometry("300x100+200+300")
# setting the title of the window
self.gui_root.title("Test Window")
# creating an entry field using the Entry() widget
self.entryField = tk.Entry(self.gui_root)
# using the bind() method on the entry field to bind key press event to the event handler function
self.entryField.bind("<KeyPress>", self.on_key_press)
# placing the entry field on the window using the pack() method with y-coordinate padding = 20
self.entryField.pack(pady = 20)
# calling the mainloop() method to display the window
self.gui_root.mainloop()
# defining a function which will be triggered when the key is pressed
def on_key_press(self, event):
# displaying a message to print on key press
print("A Key has been Pressed.")
# creating an object of DisplayWindow() class
display_window = DisplayWindow()
输出 :
-
A Key has been Pressed.
A Key has been Pressed.
A Key has been Pressed.
A Key has been Pressed.
A Key has been Pressed.
A Key has been Pressed.
解释一下 :
在上面的代码段中,我们先导入了tkinter模块。然后定义了一个DisplayWindow()类来构建GUI界面。在这个类中,我们定义了一个初始化函数来设计主窗口。使用Tk()类创建了一个空白窗口。用geometry()方法设置了窗口的大小和位置,并使用title()方法设置了窗口的标题。然后,使用Entry()部件创建了一个输入栏,并使用bind()方法将按键事件绑定到事件处理程序函数。最后,使用pack()方法定位了输入栏,y轴填充20。调用mainloop()方法以显示窗口。接下来,定义了一个事件处理函数on_key_press()。在其中使用print()方法打印一条消息,表示每当按下一个键时都会触发该事件处理程序函数。最后,实例化了DisplayWindow()类。
当我们运行代码时,屏幕上会出现一个带有输入栏的窗口。当我们在输入栏中输入“welcome”时,命令提示符将打印7次“A Key has been Pressed.”消息,表示已按下7次按键。
理解多重绑定的概念
如果我们需要将多个函数绑定到特定的小部件上,该怎么办?传递两个包含bind()方法的语句肯定行不通,因为第二条语句会覆盖第一条语句;因此,只有第二个函数将被调用,如下面的示例所示:
例子:
# importing the tkinter module
import tkinter as tk
# defining the class to build GUI
class DisplayWindow:
# defining an initializing function
def __init__(self):
# creating a window
self.gui_root = tk.Tk()
# configuring the size and position of the window
self.gui_root.geometry("300x100+200+300")
# setting the title of the window
self.gui_root.title("Test Window")
# creating an entry field using the Entry() widget
self.entryField = tk.Entry(self.gui_root)
# using the bind() method on the entry field to bind return event to the event handler function
self.entryField.bind("<Return>", self.on_first_return)
self.entryField.bind("<Return>", self.on_second_return)
# placing the entry field on the window using the pack() method with y-coordinate padding = 20
self.entryField.pack(pady = 20)
# calling the mainloop() method to display the window
self.gui_root.mainloop()
# defining a function which will be triggered when the 'return' key is pressed
def on_first_return(self, event):
# displaying a message to print on 'return' key press
print("The Return Key has been pressed once.")
# defining a function which will be triggered when the 'return' key is pressed
def on_second_return(self, event):
# displaying a message to print on 'return' key press
print("The Return Key has been pressed twice.")
# creating an object of DisplayWindow() class
display_window = DisplayWindow()
输出 :
作为一个GUI :
在命令提示符中 :
The Return Key has been pressed twice.
解释一下 :
在上面的代码片段中,我们导入了tkinter模块。然后,我们定义了一个名为DisplayWindow()的类来构建GUI。在这个类中,我们定义了一个初始化函数来设计主窗口。我们调用Tk()类创建了一个空白窗口。我们使用geometry()方法配置了窗口的大小和位置,并使用title()方法设置了窗口的标题。然后,我们使用Entry()小部件创建了一个输入字段,并使用bind()方法两次将按下回车键事件绑定到两个不同的事件处理程序函数上。然后,我们使用pack()方法和y轴填充20来定位输入字段。接下来,我们调用mainloop()方法来显示窗口。我们定义了一个事件处理函数on_first_return(),并在其中使用print()方法打印一条消息,每当按下回车键时就会打印出来。类似地,我们定义了另一个事件处理函数on_second_return(),以便在按下回车键两次时返回一条消息。最后,我们实例化了DisplayWindow()类。
结果,当我们运行代码时,在屏幕上会出现一个带有输入字段的窗口。此外,当我们在输入字段中键入“welcome”并按下’ Return ‘键时,命令提示符将打印一条消息“ The Return Key has been pressed twice.”。
我们可以通过向第二个使用bind()方法的语句插入额外的参数’ add ‘来解决这个问题。而且,不要忘记分配’ add = “+” ‘。这种方法将调用两个函数。因此,我们可以在Tkinter中启用多个绑定。
让我们来考虑以下实现以上语句的示例。
例子 :
# importing the tkinter module
import tkinter as tk
# defining the class to build GUI
class DisplayWindow:
# defining an initializing function
def __init__(self):
# creating a window
self.gui_root = tk.Tk()
# configuring the size and position of the window
self.gui_root.geometry("300x100+200+300")
# setting the title of the window
self.gui_root.title("Test Window")
# creating an entry field using the Entry() widget
self.entryField = tk.Entry(self.gui_root)
# using the bind() method on the entry field to bind return event to the event handler function
self.entryField.bind("<Return>", self.on_first_return)
self.entryField.bind("<Return>", self.on_second_return, add = "+")
# placing the entry field on the window using the pack() method with y-coordinate padding = 20
self.entryField.pack(pady = 20)
# calling the mainloop() method to display the window
self.gui_root.mainloop()
# defining a function which will be triggered when the 'return' key is pressed
def on_first_return(self, event):
# displaying a message to print on 'return' key press
print("The Return Key has been pressed once.")
# defining a function which will be triggered when the 'return' key is pressed
def on_second_return(self, event):
# displaying a message to print on 'return' key press
print("The Return Key has been pressed twice.")
# creating an object of DisplayWindow() class
display_window = DisplayWindow()
输出 :
作为一个GUI :
在命令提示符中 :
The Return Key has been pressed once.
The Return Key has been pressed twice.
解释一下 :
在上面的代码片段中,我们导入了tkinter模块。然后,我们定义了一个名为DisplayWindow()的类来构建GUI。在这个类中,我们定义了一个初始化函数来设计主窗口。我们调用Tk()类创建了一个空白窗口。我们使用geometry()方法配置了窗口的大小和位置,并使用title()方法设置了窗口的标题。然后,我们使用Entry()小部件创建了一个输入字段,并使用bind()方法两次将按下回车键事件绑定到两个不同的事件处理程序函数上。在第二个bind()方法中,我们包含了属性add并分配值“+”。然后,我们使用pack()方法和y轴填充20来定位输入字段。接下来,我们调用mainloop()方法来显示窗口。我们定义了一个事件处理函数on_first_return(),并在其中使用print()方法打印一条消息,每当按下回车键时就会打印出来。类似地,我们定义了另一个事件处理函数on_second_return(),以便在按下回车键两次时返回一条消息。最后,我们实例化了DisplayWindow()类。
结果,当我们运行代码时,在屏幕上会出现一个带有输入字段的窗口。此外,当我们在输入字段中键入“welcome”并按下’ Return ‘键时,两个函数都能正常运行并在命令提示符中打印出它们各自的语句。
类的绑定
我们可以将一个事件绑定到一个类中的所有小部件。例如,我们可能设置所有Button小部件以响应鼠标中键点击,并在法语和西班牙语标签之间来回切换。我们可以通过在任何小部件上调用bind_class()方法来将一个事件绑定到一个类中的所有小部件。
在bind_class()方法中提到的“class”一词是指Tkinter库使用的内部类的名称,而不是Python类名。bind_class()方法适用于所有小部件,并用于再次调用Tkinter绑定命令,但使用小部件类的名称。
以下是bind_class()方法的语法:
语法 :
# syntax of Tkinter's bind_class() method
idget_name.bind_class(class_name, sequence = None, func = None, add = None)
bind_class()方法的基本工作原理与bind()方法相同。
例如,我们有一些同一类别的小部件和多个输入小部件,并且我们需要将它们全部设置为同一个函数。我们可以通过以下代码片段中所示的一次调用来设置它们而不是为每一个都调用bind()方法。
例子 :
# importing the tkinter module
from tkinter import *
import tkinter as tk
# defining the class
class DisplayWindow:
# defining an initializing function
def __init__(self):
# creating a window
self.gui_root = tk.Tk()
# configuring the size and position of the window
self.gui_root.geometry("320x170+200+300")
# setting the title of the window
self.gui_root.title("Test Window")
# creating some labels
self.username_label = tk.Label(self.gui_root, text = "Username: ")
self.birthday_label = tk.Label(self.gui_root, text = "Birthday: ")
self.password_label = tk.Label(self.gui_root, text = "Password: ")
# creating some entry fields
self.username_entry = tk.Entry(self.gui_root)
self.birthday_entry = tk.Entry(self.gui_root)
self.password_entry = tk.Entry(self.gui_root)
# using the bind_class() method to bind the return event of the entry field class to the event handler function
self.username_entry.bind_class("Entry", "<Return>", self.on_return)
# setting the position of the labels and entry fields
self.username_label.grid(row = 0, column = 0, padx = 10, pady = 10, sticky = W)
self.birthday_label.grid(row = 1, column = 0, padx = 10, pady = 10, sticky = W)
self.password_label.grid(row = 2, column = 0, padx = 10, pady = 10, sticky = W)
self.username_entry.grid(row = 0, column = 1, padx = 10, pady = 10, sticky = W)
self.birthday_entry.grid(row = 1, column = 1, padx = 10, pady = 10, sticky = W)
self.password_entry.grid(row = 2, column = 1, padx = 10, pady = 10, sticky = W)
# in order to know the class type of the widget use following command.
# print(self.username_entry.winfo_class())
self.gui_root.mainloop()
# defining the function to be called when the return key is pressed
def on_return(self, event):
# message to be print on the function call
print("The Return Key has been pressed.")
# instantiating the DisplayWindow() class
display_window = DisplayWindow()
输出 :
作为一个GUI :
在命令提示符中 :
The Return Key has been pressed.
The Return Key has been pressed.
The Return Key has been pressed.
解释一下 :
在上面的代码片段中,我们导入了tkinter模块。然后,我们定义了一个名为DisplayWindow()的类来构建GUI。在这个类中,我们定义了一个初始化函数来设计主窗口。我们调用Tk()类创建了一个空白窗口。我们使用geometry()方法配置了窗口的大小和位置,并使用title()方法设置了窗口的标题。然后,我们使用Label()小部件创建一些标签以向用户显示信息。接下来,我们使用Entry()小部件创建了一个输入字段,并使用bind_class()方法将该输入字段类别的回车键按下事件绑定到一个事件处理程序函数上。然后,我们使用grid()方法定位标签和输入字段。接下来,我们调用mainloop()方法来显示窗口。我们定义了一个事件处理函数on_return(),并在其中使用print()方法打印一条消息,每当按下回车键时就会打印出来。最后,我们实例化了DisplayWindow()类。
结果,当我们运行代码时,在屏幕上会出现一个带有输入字段的窗口。此外,当我们在应用程序的输入字段中输入所需详细信息并按下’ Return ‘键时,事件处理程序函数被调用,并在命令提示符中打印了语句。
应用程序级别的绑定
我们还可以设置绑定,以便某个事件在任何小部件具有焦点或正在使用时都调用处理程序。称为bind_all()方法的该方法用于绑定应用程序级别上的事件。
让我们考虑以下所示的bind_all()方法的语法:
语法 :
# syntax of the Tkinter's bind_all() method
idget_name.bind_all(sequence = None, func = None, add = None)
bind_all()方法类似于bind()方法;但是,它适用于应用程序中的所有小部件。
例如,我们可能在整个程序中有一些相同类型的小部件,这些小部件可能属于不同的类。我们可以在任何小部件上调用bind_all()方法,以便在应用程序级别上绑定事件。在使用bind_all()时,我们不需要提及类名,因为绑定适用于应用程序的每个事件。
让我们考虑以下示例,演示了如何实现bind_all()方法。
例子 :
# importing the tkinter module
from tkinter import *
import tkinter as tk
# defining the class
class DisplayWindow:
# defining an initializing function
def __init__(self):
# creating a window
self.gui_root = tk.Tk()
# configuring the size and position of the window
self.gui_root.geometry("320x170+200+300")
# setting the title of the window
self.gui_root.title("Test Window")
# creating some labels
self.username_label = tk.Label(self.gui_root, text = "Username: ")
self.birthday_label = tk.Label(self.gui_root, text = "Birthday: ")
self.password_label = tk.Label(self.gui_root, text = "Password: ")
# creating some entry fields
self.username_entry = tk.Entry(self.gui_root)
self.birthday_entry = tk.Entry(self.gui_root)
self.password_entry = tk.Entry(self.gui_root)
# using the bind_class() method to bind the return event of the entry field class to the event handler function
self.username_entry.bind_all("<Return>", self.on_return)
# setting the position of the labels and entry fields
self.username_label.grid(row = 0, column = 0, padx = 10, pady = 10, sticky = W)
self.birthday_label.grid(row = 1, column = 0, padx = 10, pady = 10, sticky = W)
self.password_label.grid(row = 2, column = 0, padx = 10, pady = 10, sticky = W)
self.username_entry.grid(row = 0, column = 1, padx = 10, pady = 10, sticky = W)
self.birthday_entry.grid(row = 1, column = 1, padx = 10, pady = 10, sticky = W)
self.password_entry.grid(row = 2, column = 1, padx = 10, pady = 10, sticky = W)
# to know the class type of the widget use following command.
# print(self.username_entry.winfo_class())
self.gui_root.mainloop()
# defining the function to be called when the return key is pressed
def on_return(self, event):
# message to be print on the function call
print("The Return Key has been pressed.")
# instantiating the DisplayWindow() class
display_window = DisplayWindow()
输出 :
作为一个GUI :
在命令提示符中 :
The Return Key has been pressed.
The Return Key has been pressed.
The Return Key has been pressed.
解释一下 :
在上面的代码片段中,我们导入了tkinter模块。然后,我们定义了一个名为DisplayWindow()的类来构建GUI。在这个类中,我们定义了一个初始化函数来设计主窗口。我们调用Tk()类创建了一个空白窗口。我们使用geometry()方法配置了窗口的大小和位置,并使用title()方法设置了窗口的标题。然后,我们使用Label()小部件创建一些标签以向用户显示信息。接下来,我们使用Entry()小部件创建了一个输入字段,并使用bind_all()方法将该输入字段类别的回车键按下事件绑定到一个事件处理程序函数上。然后,我们使用grid()方法定位标签和输入字段。接下来,我们调用mainloop()方法来显示窗口。我们定义了一个事件处理函数on_return(),并在其中使用print()方法打印一条消息,每当按下回车键时就会打印出来。最后,我们实例化了DisplayWindow()类。
结果,当我们运行代码时,在屏幕上会出现一个带有输入字段的窗口。此外,当我们在应用程序的输入字段中输入所需详细信息并按下’ Return ‘键时,事件处理程序函数被调用,并在命令提示符中打印了语句。
总结
在上面的教程中,我们了解到Tkinter的bind()方法用于将事件与小部件的特定函数(称为事件处理程序)连接或关联。此外,我们还学习到Tkinter包支持三个级别的绑定:实例级绑定、类级绑定和应用级绑定。