Tcl/Tk 集成到 Python 中已经有一些年头了。Python 程序员可以通过 tkinter
包和它的扩展, tkinter.tix
模块和 tkinter.ttk
模块,来使用这套鲁棒的、平台无关的窗口工具集。
tkinter
包使用面向对象的方式对 Tcl/Tk 进行了一层薄包装。使用 tkinter
,你不需要写 Tcl 代码,但可能需要参考 Tk 文档,甚至 Tcl 文档。tkinter
使用 Python 类,对 Tk 的窗体微件(Widgets)进行了一系列的封装。除此之外,内部模块 _tkinter
针对 Python 和 Tcl 之间的交互,提供了一套线程安全的机制。
tkinter
最大的优点就一个字:快,再一个,是 Python 自带的。尽管官方文档不太完整,但有其他资源可以参考,比如 Tk 手册,教程等。 tkinter
也以比较过时的外观为人所知,但在 Tk 8.5 中,这一点得到了极大的改观。
tkinter 提供了允许显示,定位和控制微件的类。顶层微件为 Tk
和 Toplevel
。 其他微件包括Frame
, Label
, Entry
, Text
, Canvas
, Button
, Radiobutton
,Checkbutton
, Scale
, Listbox
, Scrollbar
, OptionMenu
, Spinbox
, LabelFrame
和 PanedWindow
.
微件的属性通过关键字参数指定。关键字参数与 Tk 下的相应资源具有相同的名称。使用几何管理器(geometry managers)Place,Pack 或 Grid 布局微件。也可以使用每个微件中可用的 place
,pack
,grid
方法来调用这些管理器。
微件的行为由资源绑定到事件(例如关键字参数命令)或使用 bind
方法。
1 常用微件
组件 | 描述 |
---|---|
Button | 一个简单的按钮,用于执行命令或其他操作。 |
Canvas | 结构化图形。该微件可用于绘制图形和绘图,创建图形编辑器以及实现自定义微件。 |
Checkbutton | 表示可以具有两个不同值的变量。单击按钮可在值之间切换。 |
Entry | 文本输入字段。 |
Frame | 容器微件。该框架可以具有边框和背景,并在创建应用程序或对话框布局时用于对其他微件进行分组。 |
Label | 显示文本或图像。 |
Listbox | 显示替代列表。列表框可以配置为获取单选按钮或清单行为。 |
Menu | 菜单窗格。用于实现下拉菜单和弹出菜单。 |
Menubutton | 菜单按钮。用于实现下拉菜单。 |
Message | 显示文字。类似于 Label 微件,但是可以自动将文本包装为给定的宽度或纵横比。 |
Radiobutton | 表示可以具有多个值之一的变量的一个值。单击按钮会将变量设置为该值,并清除与该变量关联的所有其他单选按钮。 |
Scale | 允许您通过拖动“滑块”来设置数值。 |
Scrollbar | 用于画布,条目,列表框和文本(canvas, entry, listbox, and text)微件的标准滚动条。 |
Text | 格式化文本显示。允许您显示和编辑具有各种样式和属性的文本。还支持嵌入式图像和窗口。 |
Toplevel | 显示为单独的顶级窗口的容器微件。 |
LabelFrame |
Frame 微件的一种变体,可以绘制边框和标题。 |
PanedWindow | 用于在可调整大小的窗格中组织子微件的容器微件。 |
Spinbox |
Entry 微件的一种变体,用于从范围或有序集合中选择值。 |
所有这些微件都提供 Misc 和几何管理(geometry management)方法,配置管理(configuration management)方法以及由微件本身定义的其他方法。另外,Toplevel
类还提供了窗口管理器界面(window manager interface)。
2 Mixins
tkinter 模块提供了与 Tk 中的各种窗口小部件类型相对应的类,以及许多 Mix-In 和其他帮助程序类(mixin 是旨在使用多重继承与其他类组合的类)。使用 tkinter 时,切勿直接访问 mixin 类。
Misc 由根窗口和小部件类用作 mixin。 它提供了大量与 Tk 和窗口相关的服务,因此可用于所有 tkinter 核心小部件。 这是由 完成的; 小部件仅将请求转发到适当的内部对象。
Wm 类被根窗口(root window)和 Toplevel 小部件类用作 mixin。 它也通过委派 (delegation) 提供窗口管理器服务。
像这样使用委派简化了您的应用程序代码:一旦有了小部件,就可以使用小部件实例上的方法访问 tkinter 的所有部分。
小部件类将 Grid,Pack 和 Place 类用作 mixin。 它们还可以通过委派来访问各种几何管理器。
Grid:Grid 几何管理器允许您通过在二维网格中组织小部件来创建类似表格的布局。 要使用此几何图形管理器,请使用 grid
方法。
Pack:Pack 几何管理器允许您通过将小部件“打包”到父部件中(将它们视为放置在框架中的矩形块)来创建布局。要将此几何图形管理器用于窗口小部件,请使用该窗口小部件上的 pack
方法进行设置。
Place:Place 几何图形管理器使您可以将小部件明确放置在给定位置。要使用此几何图形管理器,请使用 place
方法。
3 Widget 配置管理
Misc
派生了所有组件的基类 BaseWidget
,而 BaseWidget
派生了通用的 GUI 组件:Widget
。tkinter 所有的 GUI 组件都是 Widget
的子类。Widget 的父类有四个,除 BaseWidget
之外,还有 Pack
、Place
和 Grid
,这三个父类都是布局管理器,它们负责管理所包含的组件的大小和位置。
3.1 Misc
class Misc:
...
def configure(self, cnf=None, **kw):
"""Configure resources of a widget.
The values for resources are specified as keyword
arguments. To get an overview about
the allowed keyword arguments call the method keys.
"""
return self._configure('configure', cnf, kw)
config = configure
def cget(self, key):
"""Return the resource value for a KEY given as string."""
return self.tk.call(self._w, 'cget', '-' + key)
__getitem__ = cget
def __setitem__(self, key, value):
self.configure({key: value})
类 Misc
提供了设置和查询组件的配置项的方法。
-
cget("option") => string
:返回给定option
的当前值。选项名称和返回值都是字符串。比如:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root)
可以使用 cget
或者索引的方式获取配置项的值:
-
config({key: value})
(等同于configure
):用于设定选项的值(由__setitem__
方法重载)。比如:
如果想要一次设定多个配置项,可以:
btn.configure({'bg': 'red', 'fg': 'blue'})
获取全部偏置项,可以:
btn.configure()
若仅返回配置项的名称,可以:
要获取 name 选项,请改用 str(widget)
:
4 Widget Styling
所有 tkinter 标准小部件都提供一组基本的 "styling"
选项,这些选项使您可以修改每个小部件的颜色,字体和其他视觉效果。
4.1 Colors
大多数小部件允许您使用 background
和 foreground
选项指定小部件和文本颜色。要指定颜色,可以使用颜色名称,也可以明确指定红色,绿色和蓝色(RGB)颜色分量。
4.2 Color Names
tkinter 包含一个颜色数据库,该数据库将颜色名称映射到相应的 RGB 值。该数据库包括通用名称,例如 Red, Green, Blue, Yellow, and LightBlue,还包括更奇特的东西,例如 Moccasin, PeachPuff 等。
在 X 窗口系统上,颜色名称由X服务器定义。您也许可以找到一个名为 xrgb.txt
的文件,其中包含颜色名称和相应的 RGB 值的列表。在 Windows 和 Macintosh 系统上,颜色名称表内置在 Tk 中。
在Windows下,您还可以使用Windows系统颜色(用户可以通过控制面板更改这些颜色):
SystemActiveBorder, SystemActiveCaption, SystemAppWorkspace, SystemBackground, SystemButtonFace, SystemButtonHighlight, SystemButtonShadow, SystemButtonText, SystemCaptionText, SystemDisabledText, SystemHighlight, SystemHighlightText, SystemInactiveBorder, SystemInactiveCaption, SystemInactiveCaptionText, SystemMenu, SystemMenuText, SystemScrollbar, SystemWindow, SystemWindowFrame, SystemWindowText.
颜色名称不区分大小写。也可以使用许多(但不是全部)颜色名称,单词之间可以有空格也可以没有空格。例如,“lightblue”, “light blue”, 和 “Light Blue” 均指定相同的颜色。
4.3 RGB Specifications #
如果需要显式指定颜色,则可以使用以下格式的字符串:#RRGGBB
。
RR,GG,BB分别是红色,绿色和蓝色值的十六进制表示。以下示例显示了如何将三元组颜色转换为 Tk 颜色规范:
tk_rgb = "#%02x%02x%02x" % (128, 192, 200)
Tk还支持格式“ #RGB”和 “ #RRRRGGGGBBBB”,以分别指定 16 和 65536 级别的每个值。
您可以使用 winfo_rgb
小部件方法将颜色字符串(名称或 RGB 规范)转换为 3 元组:
rgb = widget.winfo_rgb("red")
red, green, blue = rgb[0]/256, rgb[1]/256, rgb[2]/256
请注意,winfo_rgb
返回 16 位 RGB 值,范围从 0 到 65535。要将它们映射到更常见的 0-255 范围,必须将每个值除以 256(或将它们向右移 8 位)。
4.4 Fonts
允许您以一种或另一种方式显示文本的小部件还允许您指定要使用的字体。所有小部件都提供合理的默认值,并且您几乎不必为诸如标签和按钮之类的简单元素指定字体。
通常使用 font
小部件选项指定字体。tkinter 支持许多不同的字体描述符类型:
- Font descriptors
- User-defined font names
- System fonts
- X font descriptors
从 Tk 8.0 开始,Tkinter 支持平台无关的字体描述符。您可以将一种字体指定为元组,其中包含一个 family,一个以磅为单位的高度以及一个或多个具有一种或多种样式的字符串。例子:
("Times", 10, "bold")
("Helvetica", 10, "bold italic")
("Symbol", 8)
也可以使用如下方式:
"Times 10 bold"
"Helvetica 10 bold italic"
"Symbol 8"
在 Windows 平台支持的字体有:Arial (corresponds to Helvetica), Courier New (Courier), Comic Sans MS, Fixedsys, MS Sans Serif, MS Serif, Symbol, System, Times New Roman (Times), and Verdana 等。可用的样式为 normal
, bold
, roman
, italic
, underline
, 以及 overstrike
。
tkinter.font
模块提供了 Font 类,该类允许您创建字体实例。您可以在 tkinter 接受字体说明符的任何地方使用这样的实例。您还可以使用字体实例获取字体指标,包括以该字体编写的给定字符串所占用的大小。例如:
font.Font(family="Times", size=10, weight=tkFont.BOLD)
font.Font(family="Helvetica", size=10, weight=tkFont.BOLD,
slant=tkFont.ITALIC)
font.Font(family="Symbol", size=8)
如果您需要修改小部件的字体,可以使用 config(font=...)
方法。tkinter.font.Font
常用参数:
参数 | 介绍 |
---|---|
family | Font family. |
size | Font size in points. To give the size in pixels, use a negative value. |
weight | Font thickness. Use one of 'normal'(Default) or 'bold. |
slant | Font slant. Use one of 'normal'(Default) or 'italic', 'roman' |
underline | Font underlining. If 1 (true), the font is underlined. Default is 0 (false). |
overstrike | Font strikeout. If 1 (true), a line is drawn over text written with this font. Default is 0 (false). |
4.5 Text Formatting
虽然文本标签和按钮通常只包含一行文本,但是 tkinter 也支持多行。要跨行分割文本,只需在必要时插入换行符 (\n) 。默认情况下,线条居中。您可以通过将对齐选项 设置为 left
或 right
来更改此设置。默认值为 center
。
您还可以使用 wraplength
选项设置最大宽度,然后让窗口小部件将文本本身全部包裹在多行上。tkinter 尝试在空白处换行,但是如果窗口小部件太窄,则可能会跨行破坏单个单词。
4.6 Borders
所有 tkinter 小部件都有一个边框(尽管某些小部件默认情况下不显示边框)。边框由一个可选的 3D 浮雕和一个焦点突出区域组成。
4.6.1 Relief #
浮雕(Relief)设置控制如何绘制小部件边框。
-
borderwidth
这是边框的宽度,以像素为单位。大多数小部件的默认边框宽度为一或两个像素。几乎没有理由扩大边界。 -
relief
选项控制如何绘制 3D 边框。可以将其设置为'sunken'
,'raised'
,'groove'
,'ridge'
,'flat'
之一。
4.6.2 Focus Highlights #
高亮显示设置控制如何指示小部件(或其子级之一)具有键盘焦点。在大多数情况下,高光区域是浮雕外部的边界。以下选项控制如何绘制此额外边框:
-
highlightcolor
:当窗口小部件具有键盘焦点时,此选项用于绘制突出显示区域。 通常是黑色,或其他一些鲜明的对比色。 -
highlightbackground
:当小部件没有焦点时,此选项用于绘制突出显示区域。通常与小部件背景相同。 -
highlightthickness
:此选项是突出显示区域的宽度,以像素为单位。对于可以获取键盘焦点的小部件,通常为一两个像素。