tkinter — Python 界面到 Tcl/Tk

源代码: 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 不是一个薄封装,而是添加了相当多的自己的逻辑来让体验更具 Python 风格。本文档将重点介绍这些添加和更改,并参考官方 Tcl/Tk 文档以了解未更改的详细信息。

注意

Tcl/Tk 8.5 (2007) 引入了一套现代化的主题化用户界面组件,以及用于使用这些组件的新 API。旧 API 和新 API 仍然可用。您在网上找到的大多数文档仍使用旧 API,并且可能已经严重过时。

另请参阅

  • TkDocs

    使用 Tkinter 创建用户界面的详尽教程。解释了关键概念,并使用现代 API 说明了推荐的方法。

  • Tkinter 8.5 参考:Python 的 GUI

    Tkinter 8.5 的参考文档,详细说明了可用的类、方法和选项。

Tcl/Tk 资源

  • Tk 命令

    Tkinter 使用的每个底层 Tcl/Tk 命令的综合参考。

  • Tcl/Tk 主页

    其他文档,以及指向 Tcl/Tk 核心开发的链接。

书籍

架构

Tcl/Tk 不是一个单一的库,而是由几个不同的模块组成,每个模块都有单独的功能和自己的官方文档。Python 的二进制版本还附带了一个附加模块。

Tcl

Tcl 是一种动态解释型编程语言,就像 Python 一样。虽然它可以作为通用编程语言单独使用,但它最常嵌入到 C 应用程序中,作为脚本引擎或 Tk 工具包的接口。Tcl 库有一个 C 接口,用于创建和管理一个或多个 Tcl 解释器实例,在这些实例中运行 Tcl 命令和脚本,并添加用 Tcl 或 C 实现的自定义命令。每个解释器都有一个事件队列,并且有设施向其发送事件并处理事件。与 Python 不同,Tcl 的执行模型是围绕协作式多任务设计的,而 Tkinter 弥合了这一差异(有关详细信息,请参阅Threading model)。

Tk

Tk 是用 C 实现的Tcl 包,它添加了用于创建和操作 GUI 小部件的自定义命令。每个Tk对象都嵌入了自己的 Tcl 解释器实例,其中加载了 Tk。Tk 的小部件高度可定制,但代价是外观过时。Tk 使用 Tcl 的事件队列来生成和处理 GUI 事件。

Ttk

主题化的 Tk (Ttk) 是一个较新的 Tk 小部件系列,与许多经典 Tk 小部件相比,它在不同平台上提供了更好的外观。Ttk 作为 Tk 的一部分进行分发,从 Tk 8.5 版本开始。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=True, sync=False, use=None)

构造一个顶级 Tk 小组件,它通常是应用程序的主窗口,并为此小组件初始化一个 Tcl 解释器。每个实例都有自己关联的 Tcl 解释器。

通常使用所有默认值实例化 Tk 类。但是,目前识别以下关键字参数

screenName

如果给出(作为字符串),则设置 DISPLAY 环境变量。(仅限 X11)

baseName

配置文件的名称。默认情况下,baseName 从程序名称派生(sys.argv[0])。

className

小组件类的名称。用作配置文件,也用作 Tcl 被调用的名称(interp 中的 argv0)。

useTk

如果为 True,则初始化 Tk 子系统。tkinter.Tcl() 函数将其设置为 False

同步

如果为 True,则同步执行所有 X 服务器命令,以便立即报告错误。可用于调试。(仅限 X11)

使用

指定要将应用程序嵌入其中的窗口的 id,而不是将其创建为独立的顶级窗口。id 必须以与顶级窗口的 -use 选项的值相同的方式指定(即,它具有 winfo_id() 返回的值那样的形式)。

请注意,在某些平台上,只有当 id 引用启用了 -container 选项的 Tk 框架或顶级窗口时,此操作才有效。

Tk 读取和解释名为 .className.tcl.baseName.tcl 的配置文件,并将其导入 Tcl 解释器,然后对 .className.py.baseName.py 的内容调用 exec()。配置文件的路径是 HOME 环境变量,或者如果未定义,则为 os.curdir

tk

通过实例化 Tk 创建的 Tk 应用程序对象。这提供了对 Tcl 解释器的访问。附加到 Tk 的同一实例的每个窗口小部件的 tk 属性值相同。

master

包含此窗口小部件的窗口小部件对象。对于 TkmasterNone,因为它为主窗口。术语 masterparent 类似,有时可互换用作参数名称;但是,调用 winfo_parent() 会返回窗口小部件名称的字符串,而 master 返回对象。parent/child 反映了树状关系,而 master/slave 反映了容器结构。

children

此小组件的直接子代,作为 dict,其中子小组件名称作为键,子实例对象作为值。

tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=False)

Tcl() 函数是一个工厂函数,它创建的对象与 Tk 类创建的对象非常相似,但它不会初始化 Tk 子系统。在不希望创建无关的顶级窗口或无法创建窗口(例如没有 X 服务器的 Unix/Linux 系统)的环境中驱动 Tcl 解释器时,这通常非常有用。通过调用 loadtk() 方法,可以使用 Tcl() 对象创建的的对象创建 Toplevel 窗口(并初始化 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 参考手册。

一个 Hello World 程序

我们将从 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 概念

即使是这个简单的程序也说明了以下关键的 Tk 概念

小部件

Tkinter 用户界面由各个小部件组成。每个小部件都表示为一个 Python 对象,从 ttk.Framettk.Labelttk.Button 等类进行实例化。

小部件层次结构

小部件按层次结构排列。标签和按钮包含在一个框架中,而框架又包含在根窗口中。在创建每个小部件时,其小部件作为第一个参数传递给小部件构造函数。

配置选项

小部件具有配置选项,可修改其外观和行为,例如在标签或按钮中显示的文本。不同类的小部件将具有不同的选项集。

几何管理

创建小部件时,不会自动将其添加到用户界面。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 中独立命令实现的操作(如 griddestroy)表示为 Tkinter 小部件对象上的方法。您很快就会看到,在其他时候,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 是“background”的缩写)。将缩写选项的名称传递给 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 的几何管理机制之一。几何管理器用于指定窗口小部件在其容器(其相互的主控)中的相对位置。与更繁琐的放置器(使用较少,我们在此不介绍)相比,打包器采用定性关系规范(上方左侧填充等),并计算出所有内容以确定确切的放置坐标。

任何主控窗口小部件的大小由内部“从属窗口小部件”的大小决定。打包器用于控制从属窗口小部件在打包其中的主控窗口中显示的位置。您可以将窗口小部件打包到框架中,并将框架打包到其他框架中,以实现您想要的布局。此外,打包后,该排列会动态调整以适应配置的增量更改。

请注意,窗口小部件在使用几何管理器指定其几何形状之前不会出现。一个常见的早期错误是省略几何规范,然后惊讶于窗口小部件已创建但没有任何内容出现。只有在窗口小部件应用了打包器的 pack() 方法后,它才会出现。

可以调用 pack() 方法,其中包含控制窗口小部件在其容器中显示位置以及在调整主应用程序窗口大小时如何表现的关键字选项/值对。以下是一些示例

fred.pack()                     # defaults to side = "top"
fred.pack(side="left")
fred.pack(expand=1)

打包器选项

有关打包器及其可以采用的选项的更多详细信息,请参阅手册页和 John Ousterhout 书籍的第 183 页。

anchor

锚点类型。表示打包器在其包裹中放置每个从属窗口小部件的位置。

expand

布尔值,01

fill

合法值:'x''y''both''none'

ipadx 和 ipady

距离 - 指定从属窗口小部件每侧的内部填充。

padx 和 pady

距离 - 指定从属窗口小部件每侧的外部填充。

side

合法值:'left''right''top''bottom'

耦合窗口小部件变量

某些窗口小部件(如文本输入窗口小部件)的当前值设置可以通过使用特殊选项直接连接到应用程序变量。这些选项为 variabletextvariableonvalueoffvaluevalue。此连接双向有效:如果变量因任何原因而更改,则连接到的窗口小部件将更新为反映新值。

不幸的是,在 tkinter 的当前实现中,不可能通过 variabletextvariable 选项将任意 Python 变量移交给窗口小部件。此类变量的唯一有效类型是从 tkinter 中定义的 Variable 类(子类)派生的变量。

Variable 已定义了许多有用的子类:StringVarIntVarDoubleVarBooleanVar。要读取此类变量的当前值,请调用其 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 函数。

要获取包含给定窗口小组件的顶级窗口,您通常只需引用窗口小组件的 master。当然,如果窗口小组件已打包在框架内,则 master 不会表示顶级窗口。要获取包含任意窗口小组件的顶级窗口,您可以调用 _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 选项数据类型

anchor

合法值是指南针的点: "n""ne""e""se""s""sw""w""nw",以及 "center"

bitmap

有八个内置的命名位图: 'error''gray25''gray50''hourglass''info''questhead''question''warning'。要指定 X 位图文件名,请提供文件的完整路径,前面加上 @,如 "@/usr/contrib/bitmap/gumby.bit"

boolean

您可以传递整数 0 或 1 或字符串 "yes""no"

callback

这是任何不带参数的 Python 函数。例如

def print_it():
    print("hi there")
fred["command"] = print_it
color

颜色可以作为 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"

scrollcommand

这几乎总是某个滚动条小部件的 set() 方法,但可以是任何采用单个参数的小部件方法。

wrap

必须为以下之一:"none""char""word"

绑定和事件

小部件命令中的 bind 方法允许您监视特定事件,并在发生该事件类型时触发回调函数。bind 方法的格式为

def bind(self, sequence, func, add=''):

其中

sequence

是一个字符串,表示目标事件类型。(有关详细信息,请参阅 bind(3tk) 手册页和 John Ousterhout 的著作《Tcl and the Tk Toolkit (第 2 版)》的第 201 页)。

func

是一个 Python 函数,采用一个参数,在事件发生时调用。将把 Event 实例作为参数传递。(以这种方式部署的函数通常称为回调。)

add

是可选的,可以是 '''+'。传递空字符串表示此绑定将替换与此事件关联的任何其他绑定。传递 '+' 表示此函数将添加到与此事件类型绑定的函数列表中。

例如

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

焦点

%A

字符

%h

高度

%E

发送事件

%k

键码

%K

键符号

%s

状态

%N

键符号编号

%t

时间

%T

类型

%w

宽度

%W

小部件

%x

x

%X

x_root

%y

y

%Y

y_root

index 参数

许多小部件需要传递“index”参数。这些参数用于指向文本小部件中的特定位置、输入小部件中的特定字符或菜单小部件中的特定菜单项。

输入小部件索引(index、视图索引等)

输入小部件具有引用显示文本中字符位置的选项。您可以使用这些 tkinter 函数来访问文本小部件中的这些特殊点

文本小组件索引

文本小组件的索引符号非常丰富,在 Tk 手册页中对此有最佳描述。

菜单索引(menu.invoke()、menu.entryconfig() 等)

菜单的一些选项和方法会操作特定的菜单项。任何时候选项或参数需要菜单索引,你都可以传入

  • 一个整数,表示小组件中该项的数字位置,从顶部开始,从 0 开始计数;

  • 字符串 "active",表示当前光标所在的菜单位置;

  • 字符串 "last",表示最后一个菜单项;

  • 一个以 @ 为前缀的整数,如 @6,其中该整数被解释为菜单坐标系中的 y 像素坐标;

  • 字符串 "none",表示根本没有菜单项,最常与 menu.activate() 一起使用,以停用所有项,最后,

  • 一个文本字符串,与从菜单顶部到底部扫描的菜单项标签进行模式匹配。请注意,此索引类型在所有其他索引类型之后考虑,这意味着标记为 lastactivenone 的菜单项的匹配项可能会被解释为上述文字。

图像

可以通过 tkinter.Image 的相应子类创建不同格式的图像

  • BitmapImage,用于 XBM 格式的图像。

  • PhotoImage,用于 PGM、PPM、GIF 和 PNG 格式的图像。后者从 Tk 8.6 开始支持。

这两种类型的图像都是通过 filedata 选项创建的(还提供其他选项)。

然后可以在某些小组件(例如标签、按钮、菜单)支持 image 选项的任何地方使用图像对象。在这些情况下,Tk 不会保留对图像的引用。当对图像对象的最后一个 Python 引用被删除时,图像数据也会被删除,并且 Tk 会在使用图像的任何地方显示一个空框。

另请参阅

Pillow 包增加了对 BMP、JPEG、TIFF 和 WebP 等格式的支持。

文件处理程序

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 上不可用。

由于您不知道可用于读取的字节数,因此您可能不想使用 BufferedIOBaseTextIOBase read()readline() 方法,因为这些方法会坚持读取预定义数量的字节。对于套接字,recv()recvfrom() 方法将正常工作;对于其他文件,请使用原始读取或 os.read(file.fileno(), maxbytecount)

Widget.tk.createfilehandler(file, mask, func)

注册文件处理程序回调函数 funcfile 参数可以是具有 fileno() 方法的对象(例如文件或套接字对象),也可以是整数文件描述符。mask 参数是下面三个常量的按位或组合。回调按如下方式调用

callback(file, mask)
Widget.tk.deletefilehandler(file)

注销文件处理程序。

_tkinter.READABLE
_tkinter.WRITABLE
_tkinter.EXCEPTION

mask 参数中使用的常量。