tkinter 基础教程

Tk 是唯一专门为高级动态语言(如 Tcl,Ruby,Perl,Python 等)设计的跨平台(cross-platform,即 Windows,Mac,Unix)图形用户界面工具包。

参考资源:

tkinter 是 Python 的标准 GUI (Graphical User Interface) 包。它是 Tcl/Tk 之上的薄薄的面向对象层。大多数时候,tkinter 才是您真正需要的,但是也可以使用许多其他模块。Tk 接口位于名为 _tkinter 的二进制模块中。该模块包含到 Tk 的低级接口,并且绝对不能被应用程序程序员直接使用。它通常是一个共享库(或DLL),但在某些情况下可能与 Python 解释器静态链接。

更多资源见:tkinter

1 tkinter 应用

使用 HTML/CSS 和 Python 编写的通用 GUI(无需 JavaScript)跨浏览器框架 Atlas toolkit for PythonDearPyGui 是一个 GPU 加速的 Python GUI 框架。它的核心是 DearImGui 的 Python 包装。文档位于 Github Pages 上。

2 关于 tkinter 的思考

参考:Thinking in Tkinter

我一直在尝试通过各种书籍来 学习 tkinter,但我发现这比我想像的要困难得多。问题在于这些书的作者想着急告诉我有关 tkinter 工具箱中所有小部件的信息,但从来没有真正停下来解释基本概念。他们没有解释如何“在 tkinter 中思考”。本教程试图开始理解一些基本的 tkinter 概念。

这些程序并未尝试全面介绍 tkinter 编程的所有方面。为此,请您参考 Frederik Lundh的 An Introduction to Tkinter 和 Brent Welch的 Practical Programming in Tcl and Tk

2.1 GUI 的四个基本编程任务

开发用户界面(UI)时,必须完成一组标准任务。

  1. 您必须指定想要 UI 外观的方式。也就是说,您必须编写代码来确定用户将在计算机屏幕上看到的内容。
  2. 您必须确定要 UI 执行的操作。也就是说,您必须编写完成程序任务的例程。
  3. 您必须将 "looking" 与 "doing" 相关联。也就是说,您必须编写代码,将用户在屏幕上看到的内容与为执行程序任务而编写的例程相关联。
  4. 最后,您必须编写代码,等待用户输入。

3 tkinter 基础

Python 有很多 GUI 框架,但是 tkinter 是 Python 标准库中唯一内置的框架。tkinter 具有多个优势。它是跨平台的,因此相同的代码可在 Windows,macOS 和 Linux 上运行。视觉元素是使用本机操作系统元素呈现的,因此使用 tkinter 构建的应用程序看起来就像它们属于运行平台一样。

tkinter GUI 的基本元素是窗口window)。窗口是所有其他 GUI 元素所在的容器。这些其他 GUI 元素,例如文本框,标签和按钮,称为小部件(widgets)。小部件包含在窗口内部。

首先,创建一个包含单个小部件的窗口。窗口是 tkinter 的 Tk 类的一个实例。

from tkinter import Tk

window = Tk()

接着 window.mainloop() 告诉 Python 运行 tkinter 事件循环。此方法侦听事件,例如单击按钮或按键,并阻止运行它之后的所有代码,直到关闭被调用的窗口。

window.mainloop()

当您执行上述代码时,屏幕上会弹出一个新窗口。 它的外观取决于您的操作系统:

可以看到此窗口内是空无一物的,可以添加一个小部件。

使用 Label 类创建一个标签部件:

from tkinter import Tk, Label

window = Tk()
greeting = Label(text="Hello, Tkinter")

您刚刚创建了标签小部件,但尚未将其添加到窗口中。您可以使用 Label 小部件的 .pack() 方法将其添加到窗口中:

greeting.pack()
window.mainloop()

现在窗口看起来是这样的:

3.1 常用的 Widget

小部件是 Python GUI 框架 tkinter 的基础。它们是用户与您的程序进行交互的元素。tkinter 中的每个小部件都由类定义的。以下是一些常用的小部件:

Widget 类 描述
Label 用于在屏幕上显示文本等的小部件
Button 一个可以包含文本并在单击时可以执行操作的按钮
Entry 文本输入小部件,仅允许单行文本
Text 文本输入小部件,允许多行文本输入
Frame 用于将相关小部件分组或提供填充的矩形区域

3.2 使用标签小部件显示文本和图像

标签窗口小部件用于显示文本或图像。用户无法编辑 Label 小部件显示的文本。仅用于显示目的。

标签窗口小部件以默认系统文本颜色和默认系统文本背景颜色显示文本。它们通常分别是黑色和白色,但是如果您在操作系统中更改了这些设置,则可能会看到不同的颜色。

您可以使用 foregroundbackground 参数控制“标签”的文本和背景色:

label = Label(
    text="Hello, Tkinter",
    foreground="yellow",  # Set the text color to yellow
    background="black"  # Set the background color to black
)

效果:

有许多有效的颜色名称,包括:"red","orange","yellow","green","blue","purple"。tkinter 也可以使用许多HTML color names这里 提供具有大多数有效颜色名称的图表。有关完整的参考,包括由当前系统主题控制的 macOS 和 Windows 特定的系统颜色,请查看 colors manual page

您还可以使用 hexadecimal RGB values 指定颜色:

label = Label(text="Hello, Tkinter", background="#34A2FE")

您还可以使用 widthheight 参数控制标签的宽度和高度:

label = Label(
    text="Hello, Tkinter",
    foreground="#34A2FE",
    background="black",
    width=12,
    height=10
)

效果:

即使宽度和高度都设置为10,窗口中的标签也不是正方形可能看起来很奇怪。这是因为宽度和高度都是以文本单位测量的。一个水平文本单位由默认系统字体中字符 "0" 的宽度或数字零确定。类似地,一个垂直文本单元由字符 "0" 的高度确定。

注意:tkinter 使用文本单位(而不是英寸,厘米或像素)来测量宽度和高度,以确保跨平台的应用程序行为一致。通过字符宽度来度量单位意味着小部件的大小是相对于用户计算机上默认字体的大小。这样可以确保无论应用程序在何处运行,文本都可以正确地适合标签和按钮。

标签非常适合显示一些文本,但是它们并不能帮助您从用户那里获得输入。接下来要查看的三个小部件都用于获取用户输入。

创建一个按钮:

from tkinter import Button
button = Button(
    text="Click me!",
    width=25,
    height=5,
    background="skyblue",
    foreground="yellow",
)

效果:

单行文本:

from tkinter import Entry
entry = Entry(foreground="yellow", background="blue", width=50)

效果:

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