tkinter 基本概念梳理

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 提供了允许显示,定位和控制微件的类。顶层微件为 TkToplevel。 其他微件包括Frame, Label, Entry, Text, Canvas, Button, Radiobutton,Checkbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox, LabelFramePanedWindow.

微件的属性通过关键字参数指定。关键字参数与 Tk 下的相应资源具有相同的名称。使用几何管理器(geometry managers)Place,Pack 或 Grid 布局微件。也可以使用每个微件中可用的 placepackgrid 方法来调用这些管理器。

微件的行为由资源绑定到事件(例如关键字参数命令)或使用 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 核心小部件。 这是由 delegation 完成的; 小部件仅将请求转发到适当的内部对象。

Wm 类被根窗口(root window)和 Toplevel 小部件类用作 mixin。 它也通过委派 (delegation) 提供窗口管理器服务。

像这样使用委派简化了您的应用程序代码:一旦有了小部件,就可以使用小部件实例上的方法访问 tkinter 的所有部分。

小部件类将 GridPackPlace 类用作 mixin。 它们还可以通过委派来访问各种几何管理器。

Grid:Grid 几何管理器允许您通过在二维网格中组织小部件来创建类似表格的布局。 要使用此几何图形管理器,请使用 grid 方法。

Pack:Pack 几何管理器允许您通过将小部件“打包”到父部件中(将它们视为放置在框架中的矩形块)来创建布局。要将此几何图形管理器用于窗口小部件,请使用该窗口小部件上的 pack 方法进行设置。

Place:Place 几何图形管理器使您可以将小部件明确放置在给定位置。要使用此几何图形管理器,请使用 place 方法。

3 Widget 配置管理

Misc 派生了所有组件的基类 BaseWidget,而 BaseWidget 派生了通用的 GUI 组件:Widget。tkinter 所有的 GUI 组件都是 Widget 的子类。Widget 的父类有四个,除 BaseWidget 之外,还有 PackPlaceGrid,这三个父类都是布局管理器,它们负责管理所包含的组件的大小和位置。

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 提供了设置和查询组件的配置项的方法。

  1. cget("option") => string:返回给定 option 的当前值。选项名称和返回值都是字符串。比如:
import tkinter as tk

root = tk.Tk()
btn = tk.Button(root)

可以使用 cget 或者索引的方式获取配置项的值:

  1. config({key: value}) (等同于 configure):用于设定选项的值(由 __setitem__ 方法重载)。比如:

如果想要一次设定多个配置项,可以:

btn.configure({'bg': 'red', 'fg': 'blue'})

获取全部偏置项,可以:

btn.configure()

若仅返回配置项的名称,可以:

要获取 name 选项,请改用 str(widget)

4 Widget Styling

所有 tkinter 标准小部件都提供一组基本的 "styling" 选项,这些选项使您可以修改每个小部件的颜色,字体和其他视觉效果。

4.1 Colors

大多数小部件允许您使用 backgroundforeground 选项指定小部件和文本颜色。要指定颜色,可以使用颜色名称,也可以明确指定红色,绿色和蓝色(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) 。默认情况下,线条居中。您可以通过将对齐选项 设置为 leftright 来更改此设置。默认值为 center

您还可以使用 wraplength 选项设置最大宽度,然后让窗口小部件将文本本身全部包裹在多行上。tkinter 尝试在空白处换行,但是如果窗口小部件太窄,则可能会跨行破坏单个单词。

4.6 Borders

所有 tkinter 小部件都有一个边框(尽管某些小部件默认情况下不显示边框)。边框由一个可选的 3D 浮雕和一个焦点突出区域组成。

4.6.1 Relief #

浮雕(Relief)设置控制如何绘制小部件边框。

  1. borderwidth 这是边框的宽度,以像素为单位。大多数小部件的默认边框宽度为一或两个像素。几乎没有理由扩大边界。
  2. relief 选项控制如何绘制 3D 边框。可以将其设置为 'sunken', 'raised', 'groove', 'ridge', 'flat' 之一。

4.6.2 Focus Highlights #

高亮显示设置控制如何指示小部件(或其子级之一)具有键盘焦点。在大多数情况下,高光区域是浮雕外部的边界。以下选项控制如何绘制此额外边框:

  1. highlightcolor:当窗口小部件具有键盘焦点时,此选项用于绘制突出显示区域。 通常是黑色,或其他一些鲜明的对比色。
  2. highlightbackground:当小部件没有焦点时,此选项用于绘制突出显示区域。通常与小部件背景相同。
  3. highlightthickness:此选项是突出显示区域的宽度,以像素为单位。对于可以获取键盘焦点的小部件,通常为一两个像素。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345