tkinter — Tcl/Tk 的 Python 接口 — Python 文档
tkinter — Tcl/Tk 的 Python 接口
源代码: :source:`Lib/tkinter/__init__.py`
tkinter 包(“Tk 接口”)是 Tcl/Tk GUI 工具包的标准 Python 接口。 Tk 和 tkinter 在大多数 Unix 平台(包括 macOS)以及 Windows 系统上都可用。
从命令行运行 python -m tkinter
应该会打开一个窗口,演示一个简单的 Tk 界面,让您知道 tkinter 已正确安装在您的系统上,并显示安装了哪个版本的 Tcl/Tk ,因此您可以阅读特定于该版本的 Tcl/Tk 文档。
Tkinter 支持一系列 Tcl/Tk 版本,构建时有或没有线程支持。 官方 Python 二进制版本捆绑了 Tcl/Tk 8.6 线程。 有关受支持版本的更多信息,请参阅 _tkinter
模块的源代码。
Tkinter 不是一个简单的包装器,而是添加了大量自己的逻辑来使体验更加 Pythonic。 本文档将重点介绍这些添加和更改,并参考官方 Tcl/Tk 文档以了解未更改的详细信息。
笔记
Tcl/Tk 8.5 (2007) 引入了一组现代主题用户界面组件以及使用它们的新 API。 新旧 API 仍然可用。 您可以在网上找到的大多数文档仍然使用旧的 API,并且可能已经过时了。
也可以看看
- *; 文档
- 关于使用 Tkinter 创建用户界面的广泛教程。 解释关键概念,并说明使用现代 API 的推荐方法。
- *; Tkinter 8.5 参考:Python 的 GUI
- Tkinter 8.5 的参考文档详细说明了可用的类、方法和选项。
Tcl/Tk 资源:
图书:
- *; 忙碌的 Python 开发人员的现代 Tkinter
- 通过马克罗斯曼。 (ISBN 978-1999149567)
- *; Python 和 Tkinter 编程
- 通过艾伦摩尔。 (ISBN 978-1788835886)
- *; 编程 Python
- 作者:马克·卢茨; 对 Tkinter 有很好的覆盖。 (ISBN 978-0596158101)
- *; Tcl 和 Tk 工具包(第二版)
- 作者:Tcl/Tk 的发明者 John Ousterhout 和 Ken Jones; 不包括 Tkinter。 (ISBN 978-0321336330)
建筑学
Tcl/Tk 不是一个单一的库,而是由几个不同的模块组成,每个模块都有独立的功能和自己的官方文档。 Python 的二进制版本还随附了一个附加模块。
- TCL
- Tcl 是一种动态解释型编程语言,就像 Python 一样。 尽管它可以单独用作通用编程语言,但它最常作为脚本引擎或 Tk 工具包的接口嵌入到 C 应用程序中。 Tcl 库有一个 C 接口来创建和管理 Tcl 解释器的一个或多个实例,在这些实例中运行 Tcl 命令和脚本,并添加在 Tcl 或 C 中实现的自定义命令。 每个解释器都有一个事件队列,并且有一些工具可以向它发送事件并处理它们。 与 Python 不同,Tcl 的执行模型是围绕协作多任务设计的,Tkinter 弥合了这种差异(详见 线程模型 )。
- TK
- Tk 是一个用 C 实现的 Tcl 包 ,它添加了自定义命令来创建和操作 GUI 小部件。 每个 Tk 对象都嵌入了自己的 Tcl 解释器实例,并将 Tk 加载到其中。 Tk 的小部件非常可定制,但代价是外观过时。 Tk 使用 Tcl 的事件队列来生成和处理 GUI 事件。
- 塔克
- Themed Tk (Ttk) 是一个更新的 Tk 小部件系列,与许多经典 Tk 小部件相比,它在不同平台上提供了更好的外观。 从 Tk 8.5 版开始,Ttk 作为 Tk 的一部分分发。 Python 绑定在单独的模块 tkinter.ttk 中提供。
在内部,Tk 和 Ttk 使用底层操作系统的工具,即 Unix/X11 上的 Xlib,macOS 上的 Cocoa,Windows 上的 GDI。
当你的 Python 应用程序使用 Tkinter 中的一个类时,例如,创建一个小部件,tkinter 模块首先组装一个 Tcl/Tk 命令字符串。 它将 Tcl 命令字符串传递给内部 _tkinter
二进制模块,然后调用 Tcl 解释器对其进行评估。 然后 Tcl 解释器将调用 Tk 和/或 Ttk 包,这些包将依次调用 Xlib、Cocoa 或 GDI。
Tkinter 模块
对 Tkinter 的支持分布在多个模块中。 大多数应用程序将需要主 tkinter 模块,以及 tkinter.ttk 模块,该模块提供现代主题小部件集和 API:
from tkinter import *
from tkinter import ttk
- class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)
- Tk 类是在没有参数的情况下实例化的。 这将创建 Tk 的顶级小部件,它通常是应用程序的主窗口。 每个实例都有自己关联的 Tcl 解释器。
- tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)
- Tcl() 函数是一个工厂函数,它创建的对象与 Tk 类创建的对象非常相似,只是它不初始化 Tk 子系统。 在不想创建无关的顶层窗口或不能创建的环境(例如没有 X 服务器的 Unix/Linux 系统)中驱动 Tcl 解释器时,这通常很有用。 由 Tcl() 对象创建的对象可以通过调用其
loadtk()
方法来创建顶层窗口(并初始化 Tk 子系统)。
提供 Tk 支持的模块包括:
tkinter
- 主 Tkinter 模块。
tkinter.colorchooser
- 让用户选择颜色的对话框。
tkinter.commondialog
- 此处列出的其他模块中定义的对话框的基类。
tkinter.filedialog
- 允许用户指定要打开或保存的文件的通用对话框。
tkinter.font
- 帮助处理字体的实用程序。
tkinter.messagebox
- 访问标准 Tk 对话框。
tkinter.scrolledtext
- 内置垂直滚动条的文本小部件。
tkinter.simpledialog
- 基本对话框和便利功能。
tkinter.ttk
- Tk 8.5 中引入的主题小部件集,为主要 tkinter 模块中的许多经典小部件提供现代替代品。
附加模块:
_tkinter
- 一个二进制模块,包含 Tcl/Tk 的低级接口。 它由主 tkinter 模块自动导入,不应由应用程序员直接使用。 它通常是一个共享库(或 DLL),但在某些情况下可能与 Python 解释器静态链接。
idlelib
- Python 的集成开发和学习环境 (IDLE)。 基于 tkinter。
tkinter.constants
- 将各种参数传递给 Tkinter 调用时,可以用来代替字符串的符号常量。 由主 tkinter 模块自动导入。
tkinter.dnd
- (实验性)对 tkinter 的拖放支持。 当它被 Tk DND 取代时,它将被弃用。
tkinter.tix
- (不推荐使用)一个旧的第三方 Tcl/Tk 包,它添加了几个新的小部件。 在 tkinter.ttk 中可以找到大多数更好的替代方案。
turtle
- Tk 窗口中的海龟图形。
Tkinter 生命保护器
本节并非设计为关于 Tk 或 Tkinter 的详尽教程。 为此,请参阅前面提到的外部资源之一。 相反,本节非常快速地介绍了 Tkinter 应用程序的外观,确定了基本的 Tk 概念,并解释了 Tkinter 包装器的结构。
本节的其余部分将帮助您确定 Tkinter 应用程序中需要的类、方法和选项,以及在哪里可以找到关于它们的更详细文档,包括在官方 Tcl/Tk 参考手册中。
你好世界计划
我们将从介绍 Tkinter 中的“Hello World”应用程序开始。 这不是我们能写的最小的一个,但足以说明你需要知道的一些关键概念。
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
导入后,下一行创建 Tk 类的实例,该类初始化 Tk 并创建其关联的 Tcl 解释器。 它还创建一个顶级窗口,称为根窗口,用作应用程序的主窗口。
以下行创建了一个框架小部件,在本例中,它将包含我们接下来将创建的标签和按钮。 该框架适合在根窗口内。
下一行创建一个包含静态文本字符串的标签小部件。 grid()
方法用于指定标签在其包含框架小部件中的相对布局(位置),类似于 HTML 中的表格的工作方式。
然后创建一个按钮小部件,并将其放置在标签的右侧。 当按下时,它将调用根窗口的 destroy()
方法。
最后,mainloop()
方法将所有内容都放在显示器上,并响应用户输入,直到程序终止。
重要的传统知识概念
即使是这个简单的程序也说明了以下关键的 Tk 概念:
- 小部件
- Tkinter 用户界面由单独的 小部件 组成。 每个小部件都表示为一个 Python 对象,从
ttk.Frame
、ttk.Label
和ttk.Button
等类实例化。 - 小部件层次结构
- 小部件按 层次结构 排列。 标签和按钮包含在框架中,而框架又包含在根窗口中。 创建每个 child 小部件时,其 parent 小部件作为第一个参数传递给小部件构造函数。
- 配置选项
- 小部件具有 配置选项 ,可修改其外观和行为,例如要在标签或按钮中显示的文本。 不同类别的小部件将具有不同的选项集。
- 几何管理
- 小部件在创建时不会自动添加到用户界面。 几何管理器 像
grid
控制它们在用户界面中的位置。 - 事件循环
- Tkinter 对用户输入、程序中的更改做出反应,甚至仅在主动运行 事件循环 时才刷新显示。 如果您的程序没有运行事件循环,您的用户界面将不会更新。
了解 Tkinter 如何包装 Tcl/Tk
当您的应用程序使用 Tkinter 的类和方法时,Tkinter 在内部组装表示 Tcl/Tk 命令的字符串,并在附加到您的应用程序的 Tk 实例的 Tcl 解释器中执行这些命令。
无论是尝试浏览参考文档、尝试找到正确的方法或选项、改编一些现有代码,还是调试您的 Tkinter 应用程序,有时了解这些底层 Tcl/Tk 命令的外观会很有用。
为了说明,这里是上面 Tkinter 脚本主要部分的 Tcl/Tk 等效项。
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
Tcl 的语法类似于许多 shell 语言,其中第一个单词是要执行的命令,后面是该命令的参数,用空格分隔。 在不涉及太多细节的情况下,请注意以下几点:
- 用于创建小部件的命令(如
ttk::frame
)对应于 Tkinter 中的小部件类。 - Tcl 小部件选项(如
-text
)对应于 Tkinter 中的关键字参数。 - 小部件由 Tcl 中的 路径名 引用(如
.frm.btn
),而 Tkinter 不使用名称而是使用对象引用。 - 小部件在小部件层次结构中的位置在其(分层)路径名中进行编码,该路径名使用
.
(点)作为路径分隔符。 根窗口的路径名就是.
(点)。 在 Tkinter 中,层次结构不是由路径名定义的,而是通过在创建每个子小部件时指定父小部件来定义的。 - 在 Tcl 中作为单独的 commands 实现的操作(如
grid
或destroy
)在 Tkinter 小部件对象上表示为 methods。 正如您将很快看到的,在其他时候,Tcl 使用看似是对小部件对象的方法调用,这更接近于 Tkinter 中使用的内容。
我如何能…? 什么选择……?
如果您不确定如何在 Tkinter 中执行某些操作,并且无法立即在您正在使用的教程或参考文档中找到它,那么有一些策略可能会有所帮助。
首先,请记住,各个小部件如何工作的细节可能因 Tkinter 和 Tcl/Tk 的不同版本而异。 如果您正在搜索文档,请确保它对应于您系统上安装的 Python 和 Tcl/Tk 版本。
在搜索如何使用 API 时,知道您正在使用的类、选项或方法的确切名称会很有帮助。 自省,无论是在交互式 Python shell 中还是使用 print(),都可以帮助您确定您需要什么。
要找出任何小部件上可用的配置选项,请调用其 configure()
方法,该方法返回一个字典,其中包含有关每个对象的各种信息,包括其默认值和当前值。 使用 keys()
仅获取每个选项的名称。
btn = ttk.Button(frm, ...)
print(btn.configure().keys())
由于大多数小部件都有许多共同的配置选项,因此找出特定于特定小部件类的特定选项会很有用。 将选项列表与更简单的小部件(如框架)的列表进行比较是一种方法。
print(set(btn.configure().keys()) - set(frm.configure().keys()))
同样,您可以使用标准的 dir() 函数找到小部件对象的可用方法。 如果您尝试一下,您会看到有超过 200 种常见的小部件方法,因此再次识别特定于小部件类的方法会很有帮助。
print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
线程模型
Python 和 Tcl/Tk 有非常不同的线程模型,tkinter 试图桥接。 如果您使用线程,则可能需要注意这一点。
Python 解释器可能有许多与之关联的线程。 在 Tcl 中,可以创建多个线程,但每个线程都有一个单独的 Tcl 解释器实例与之关联。 线程也可以创建多个解释器实例,尽管每个解释器实例只能由创建它的一个线程使用。
tkinter 创建的每个 Tk 对象都包含一个 Tcl 解释器。 它还跟踪哪个线程创建了该解释器。 可以从任何 Python 线程调用 tkinter。 在内部,如果调用来自除创建 Tk 对象的线程之外的线程,则会将事件发布到解释器的事件队列,并在执行时将结果返回给调用 Python 线程。
Tcl/Tk 应用程序通常是事件驱动的,这意味着在初始化之后,解释器运行一个事件循环(即 Tk.mainloop()
) 并响应事件。 因为是单线程的,事件处理程序必须快速响应,否则会阻塞其他事件的处理。 为了避免这种情况,任何长时间运行的计算都不应该在事件处理程序中运行,而是使用计时器分解成更小的部分,或者在另一个线程中运行。 这与许多 GUI 工具包不同,在这些工具包中,GUI 在与所有应用程序代码(包括事件处理程序)完全独立的线程中运行。
如果 Tcl 解释器没有运行事件循环和处理事件,则从运行 Tcl 解释器的线程以外的线程发出的任何 tkinter 调用都将失败。
存在一些特殊情况:
- 可以构建 Tcl/Tk 库,因此它们不是线程感知的。 在这种情况下,tkinter 从原始 Python 线程调用库,即使这与创建 Tcl 解释器的线程不同。 全局锁确保一次只发生一个调用。
- 虽然 tkinter 允许你创建一个以上的 Tk 对象的实例(使用它自己的解释器),但属于同一线程的所有解释器共享一个公共事件队列,它得到丑的快。 在实践中,一次不要创建一个以上的 Tk 实例。 否则,最好在单独的线程中创建它们并确保您正在运行线程感知 Tcl/Tk 构建。
- 阻塞事件处理程序并不是阻止 Tcl 解释器重新进入事件循环的唯一方法。 甚至可以运行多个嵌套的事件循环或完全放弃事件循环。 如果您在处理事件或线程方面有任何棘手的事情,请注意这些可能性。
- 有一些选择 tkinter 函数目前仅在从创建 Tcl 解释器的线程调用时才起作用。
方便参考
设置选项
选项控制小部件的颜色和边框宽度等内容。 可以通过三种方式设置选项:
- 在对象创建时,使用关键字参数
fred = Button(self, fg="red", bg="blue")
- 创建对象后,将选项名称视为字典索引
fred["fg"] = "red" fred["bg"] = "blue"
- 使用 config() 方法在创建对象后更新多个属性
fred.config(fg="red", bg="blue")
有关给定选项及其行为的完整说明,请参阅相关小部件的 Tk 手册页。
请注意,手册页列出了每个小部件的“标准选项”和“小部件特定选项”。 前者是许多小部件共有的选项列表,后者是该特定小部件特有的选项。 标准选项记录在 options(3) 手册页上。
本文档中不区分标准选项和特定于小部件的选项。 某些选项不适用于某些类型的小部件。 给定的小部件是否响应特定选项取决于小部件的类别; 按钮有 command
选项,标签没有。
给定小部件支持的选项列在该小部件的手册页中,或者可以在运行时通过调用不带参数的 config()
方法或调用该小部件上的 keys()
方法来查询。 这些调用的返回值是一个字典,其键是字符串形式的选项名称(例如,'relief'
),其值为 5 元组。
一些选项,如 bg
是具有长名称的常用选项的同义词(bg
是“背景”的简写)。 将 config()
方法传递给速记选项的名称将返回一个 2 元组,而不是 5 元组。 传回的 2 元组将包含同义词的名称和“真实”选项(例如 ('bg', 'background')
)。
指数 | 意义 | 例子 |
---|---|---|
0 | 选项名称 | 'relief'
|
1 | 数据库查找的选项名称 | 'relief'
|
2 | 用于数据库查找的选项类 | 'Relief'
|
3 | 默认值 | 'raised'
|
4 | 当前值 | 'groove'
|
例子:
>>> print(fred.config())
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}
当然,打印的字典将包括所有可用选项及其值。 这仅作为示例。
包装工
封隔器是 Tk 的几何管理机制之一。 几何管理器用于指定小部件在其容器内的相对定位 - 它们的相互 master。 相对于比较笨重的placer(使用较少,这里不做介绍),packer采取定性关系规范——above,to the left of 、 填充 等 - 并努力为您确定确切的放置坐标。
任何 master 小部件的大小由内部“从属小部件”的大小决定。 打包器用于控制从属部件在它们被打包到的主部件中出现的位置。 您可以将小部件打包到框架中,并将框架打包到其他框架中,以实现您想要的那种布局。 此外,一旦打包,该安排会动态调整以适应配置的增量更改。
请注意,在使用几何管理器指定几何之前,小部件不会出现。 忽略几何规范是一个常见的早期错误,然后当小部件被创建但什么也没出现时会感到惊讶。 小部件只有在它应用了例如打包程序的 pack()
方法后才会出现。
可以使用关键字-选项/值对调用 pack() 方法,这些对控制小部件在其容器中的显示位置,以及在调整主应用程序窗口大小时的行为方式。 这里有些例子:
fred.pack() # defaults to side = "top"
fred.pack(side="left")
fred.pack(expand=1)
封隔器选项
有关加壳程序及其可以采用的选项的更多信息,请参阅手册页和 John Ousterhout 的书的第 183 页。
- 锚
- 锚型。 表示包装工将每个奴隶放置在其包裹中的位置。
- 扩张
- 布尔值,
0
或1
。 - 填
- 合法值:
'x'
、'y'
、'both'
、'none'
。 - ipadx 和 ipady
- 距离 - 在从属部件的每一侧指定内部填充。
- padx 和 pady
- 距离 - 在从属部件的每一侧指定外部填充。
- 边
- 合法值为:
'left'
、'right'
、'top'
、'bottom'
。
耦合小部件变量
某些小部件(如文本输入小部件)的当前值设置可以通过使用特殊选项直接连接到应用程序变量。 这些选项是 variable
、textvariable
、onvalue
、offvalue
和 value
。 这种连接是双向的:如果变量因任何原因发生变化,它所连接的小部件将更新以反映新值。
不幸的是,在 tkinter 的当前实现中,不可能通过 variable
或 textvariable
选项将任意 Python 变量移交给小部件。 唯一可以使用的变量类型是从名为 Variable 的类派生的变量,该类在 tkinter 中定义。
已经定义了许多有用的 Variable 子类:StringVar
、IntVar
、DoubleVar
和 BooleanVar
。 要读取此类变量的当前值,请对其调用 get()
方法,并调用 set()
方法更改其值。 如果您遵循此协议,小部件将始终跟踪变量的值,而无需您进一步干预。
例如:
import tkinter as tk
class App(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
self.entrythingy = tk.Entry()
self.entrythingy.pack()
# Create the application variable.
self.contents = tk.StringVar()
# Set it to some value.
self.contents.set("this is a variable")
# Tell the entry widget to watch this variable.
self.entrythingy["textvariable"] = self.contents
# Define a callback for when the user hits return.
# It prints the current value of the variable.
self.entrythingy.bind('<Key-Return>',
self.print_contents)
def print_contents(self, event):
print("Hi. The current entry content is:",
self.contents.get())
root = tk.Tk()
myapp = App(root)
myapp.mainloop()
窗口管理器
在 Tk 中,有一个实用命令 wm
,用于与窗口管理器交互。 wm
命令的选项允许您控制标题、位置、图标位图等内容。 在 tkinter 中,这些命令已作为 Wm
类上的方法实现。 顶级小部件是 Wm
类的子类,因此可以直接调用 Wm
方法。
要获得包含给定小部件的顶级窗口,您通常可以仅参考小部件的主窗口。 当然,如果小部件已打包在框架内,则主窗口将不会代表顶级窗口。 要获得包含任意小部件的顶级窗口,您可以调用 _root()
方法。 此方法以下划线开头,表示此函数是实现的一部分,而不是 Tk 功能的接口。
以下是一些典型用法的示例:
import tkinter as tk
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack()
# create the application
myapp = App()
#
# here are method calls to the window manager class
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)
# start the program
myapp.mainloop()
Tk 选项数据类型
- 锚
合法值是罗盘的点数:
"n"
、"ne"
、"e"
、"se"
、"s"
、"sw"
、"w"
、"nw"
以及"center"
。- 位图
有八个内置的命名位图:
'error'
、'gray25'
、'gray50'
、'hourglass'
、'info'
、'questhead'
]、'question'
、'warning'
。 要指定 X 位图文件名,请提供文件的完整路径,并以@
开头,如"@/usr/contrib/bitmap/gumby.bit"
。- 布尔值
您可以传递整数 0 或 1 或字符串
"yes"
或"no"
。- 打回来
这是任何不带参数的 Python 函数。 例如:
def print_it(): print("hi there") fred["command"] = print_it
- 颜色
颜色可以是 rgb.txt 文件中 X 颜色的名称,也可以是表示 4 位 RGB 值的字符串:
"#RGB"
,8 位:"#RRGGBB"
,12 位”"#RRRGGGBBB"
或 16 位"#RRRRGGGGBBBB"
范围,其中 R、G、B 表示任何合法的十六进制数字。 有关详细信息,请参阅 Ousterhout 书中的第 160 页。- 光标
可以使用来自
cursorfont.h
的标准 X 光标名称,无需XC_
前缀。 例如,要获得手形光标 (XC_hand2
),请使用字符串"hand2"
。 您还可以指定自己的位图和遮罩文件。 参见 Ousterhout 书中的第 179 页。- 距离
屏幕距离可以以像素或绝对距离指定。 像素以数字形式给出,绝对距离以字符串形式给出,尾随字符表示单位:
c
表示厘米,i
表示英寸,m
表示毫米,p
] 为打印机点数。 例如,3.5 英寸表示为"3.5i"
。- 字体
Tk 使用列表字体名称格式,例如
{courier 10 bold}
。 带有正数的字体大小以磅为单位; 带有负数的尺寸以像素为单位。- 几何学
这是一个格式为
widthxheight
的字符串,其中大多数小部件的宽度和高度以像素为单位(显示文本的小部件以字符为单位)。 例如:fred["geometry"] = "200x100"
。- 证明合法
合法值为字符串:
"left"
、"center"
、"right"
和"fill"
。- 地区
这是一个包含四个以空格分隔的元素的字符串,每个元素都是一个合法的距离(见上文)。 例如:
"2 3 4 5"
和"3i 2i 4.5i 2i"
和"3c 2c 4c 10.43c"
都是合法的区域。- 宽慰
确定小部件的边框样式。 合法值为:
"raised"
、"sunken"
、"flat"
、"groove"
和"ridge"
。- 滚动命令
这几乎总是某些滚动条小部件的
set()
方法,但可以是任何接受单个参数的小部件方法。- 裹
必须是以下之一:
"none"
、"char"
或"word"
。
绑定和事件
小部件命令中的 bind 方法允许您监视某些事件并在该事件类型发生时触发回调函数。 bind方法的形式为:
def bind(self, sequence, func, add=''):
在哪里:
- 序列
- 是一个字符串,表示事件的目标类型。 (有关详细信息,请参阅 John Ousterhout 的书的 bind 手册页和第 201 页)。
- 功能
- 是一个 Python 函数,带有一个参数,在事件发生时被调用。 Event 实例将作为参数传递。 (以这种方式部署的函数通常称为 callbacks。)
- 添加
- 是可选的,可以是
或
'+'
。 传递空字符串表示此绑定将替换与此事件关联的任何其他绑定。 传递一个'+'
意味着这个函数将被添加到绑定到这个事件类型的函数列表中。
例如:
def turn_red(self, event):
event.widget["activeforeground"] = "red"
self.button.bind("<Enter>", self.turn_red)
请注意如何在 turn_red()
回调中访问事件的小部件字段。 此字段包含捕获 X 事件的小部件。 下表列出了您可以访问的其他事件字段,以及它们在 Tk 中的表示方式,这在参考 Tk 手册页时非常有用。
TK | Tkinter 事件字段 | TK | Tkinter 事件字段 |
---|---|---|---|
%f | 重点 | %一种 | 字符 |
%H | 高度 | %E | 发送事件 |
%k | 关键代码 | %K | 键符 |
%s | 状态 | %N | keysym_num |
%t | 时间 | %T | 类型 |
%w | 宽度 | %W | 小部件 |
%x | x | %X | x_root |
%y | y | %Y | y_root |
索引参数
许多小部件需要传递“索引”参数。 它们用于指向 Text 小部件中的特定位置,或 Entry 小部件中的特定字符,或 Menu 小部件中的特定菜单项。
- 条目小部件索引(索引、视图索引等)
- 条目小部件具有指代正在显示的文本中的字符位置的选项。 您可以使用这些 tkinter 函数来访问文本小部件中的这些特殊点:
- 文本小部件索引
- Text 小部件的索引符号非常丰富,在 Tk 手册页中得到了最好的描述。
- 菜单索引(menu.invoke(), menu.entryconfig() 等)
- 菜单的一些选项和方法操作特定的菜单条目。 任何时候选项或参数需要菜单索引时,您都可以传入:
- 一个整数,它指的是小部件中条目的数字位置,从顶部开始计数,从 0 开始;
- 字符串
"active"
,指的是当前光标所在的菜单位置; - 字符串
"last"
指的是最后一个菜单项; - 前面有
@
的整数,如@6
,其中整数被解释为菜单坐标系中的 y 像素坐标; - 字符串
"none"
,表示根本没有菜单条目,最常与 menu.activate() 一起使用以停用所有条目,最后, - 从菜单顶部到底部扫描的与菜单条目标签匹配的文本字符串。 请注意,此索引类型是在所有其他类型之后考虑的,这意味着匹配标记为
last
、active
或none
的菜单项可能会被解释为上述文字,而不是.
图片
通过tkinter.Image
对应的子类可以创建不同格式的图片:
BitmapImage
用于 XBM 格式的图像。PhotoImage
适用于 PGM、PPM、GIF 和 PNG 格式的图像。 从 Tk 8.6 开始支持后者。
任一类型的图像都是通过 file
或 data
选项创建的(其他选项也可用)。
然后可以在某些小部件支持 image
选项的任何地方使用图像对象(例如 标签、按钮、菜单)。 在这些情况下,Tk 不会保留对图像的引用。 当最后一个 Python 对图像对象的引用被删除时,图像数据也被删除,并且 Tk 将在使用图像的任何地方显示一个空框。
文件处理程序
Tk 允许您注册和取消注册一个回调函数,当文件描述符上的 I/O 可能时,它将从 Tk 主循环调用。 每个文件描述符只能注册一个处理程序。 示例代码:
import tkinter
widget = tkinter.Tk()
mask = tkinter.READABLE | tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)
此功能在 Windows 上不可用。
由于您不知道有多少字节可供读取,您可能不想使用 BufferedIOBase 或 TextIOBase read() 或 readline () 方法,因为这些方法会坚持读取预定义的字节数。 对于套接字,recv() 或 recvfrom() 方法可以正常工作; 对于其他文件,使用原始读取或 os.read(file.fileno(), maxbytecount)
。
- Widget.tk.createfilehandler(file, mask, func)
注册文件处理回调函数 func。 file 参数可以是具有 fileno() 方法的对象(例如文件或套接字对象),也可以是整数文件描述符。 mask 参数是以下三个常量中任何一个的 ORed 组合。 回调调用如下:
callback(file, mask)
- Widget.tk.deletefilehandler(file)
- 取消注册文件处理程序。
- tkinter.READABLE
tkinter.WRITABLE
tkinter.EXCEPTION
- mask 参数中使用的常量。