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 参数中使用的常量。