GUI,Graphical User Interface(图形用户界面)编程主要使用的 GUI 工具包是 Python 默认的 GUI 库 Tk,通过 Python 的接口 Tkinter(“Tk interface”的缩写)可以访问 Tk

tkinter

tkinter 是 Python 的默认 GUI 库,它基于 Tk 工具包,该工具包最初是为工具命令语言(Tool Command Language,Tcl)设计的;Tk 普及后,被移植到很多其他的脚本语言中,包括 Perl(Perl/Tk)、Ruby(Ruby/Tk)和 Python(Tkinter)

让 GUI 程序启动和运行起来需要以下五个主要步骤:

  1. 导入 tkinter 模块或 from Tkinter import *
  2. 创建一个顶层窗口对象,用于容纳整个 GUI 应用
  3. 在顶层窗口对象之上或者“其中”构建所有的 GUI 组件及其功能)
  4. 通过底层的应用代码将这些GUI组件连接起来
  5. 进入主事件循环

    窗口和控件

    在 GUI 编程中,顶层的根窗口对象包含组成 GUI 应用的所有小窗口对象;它们可能是文字标签、按钮、列表框等,这些独立的 GUI 组件称为控件

所以当说创建一个顶层窗口时,只是表示需要一个地方来摆放所有的控件;控件可以独立存在,也可以作为容器存在;如果一个控件包含其他控件,就可以将其认为是那些控件的父控件

相应地,如果一个控件被其他控件包含,则将其认为是那个控件的子控件,而父控件就是下一个直接包围它的容器控件。

事件驱动处理

控件有一些相关的行为,比如按下按钮、将文本写入文本框等;这些用户行为称为事件,而 GUI 对这类事件的响应称为回调

事件可以包括按钮按下(及释放)、鼠标移动、敲击回车键等,一个 GUI 应用从开始到结束就是通过整套事件体系来驱动的,这种方式称为事件驱动处理

布局管理器

Tk 有 3 种布局管理器来帮助控件集进行定位

  • Placer

它的做法非常直接:提供控件的大小和摆放位置,然后管理器就会将其摆放好;问题是必须对所有控件进行这些操作,这样就会加重编程开发者的负担,因为这些操作本应该是自动完成的

  • Packer

它会把控件填充到正确的位置(即指定的父控件中),然后对于之后的每个控件,会去寻找剩余的空间进行填充;这个处理很像是旅行时往行李箱中填充行李的过程

  • Grid

基于网格坐标,使用 Grid 来指定 GUI 控件的放置;Grid 会在它们的网格位置上渲染 GUI 应用中的每个对象

GUI 示例

顶层窗口

1
2
import tkinter
top = tkinter.Tk()

Tk 控件

控件 名称 描述
Button 按钮 类似标签,但提供额外的功能,例如鼠标掠过、按下、释放以及键盘操作/事件
Canvas 画布 提供绘图功能(直线、椭圆、多边形、矩形),可以包含图形或位图
Checkbutton 选择按钮 一组方框,可以选择其中的任意个(类似 HTML 中的 checkbox)
Entry 文本框 单行文字域,用来收集键盘输入(类似 HTML 中的 text)
Frame 框架 包含其他组件的纯容器
Label 标签 用来显示文字或图片
LabelFrame 标签框架 标签和框架的组合,拥有额外的标签属性
Listbox 列表框 一个选项列表,用户可以从中选择
Menu 菜单 点下菜单按钮后弹出的一个选项列表,用户可以从中选择
Menubutton 菜单按钮 用来实现下拉式菜单
Message 消息框 类似于标签,但可以显示多行文本
PanedWindow 容器窗口 控制其他组件在其中摆放的容器控件
Radiobutton 单选按钮 一组按钮,其中只有一个可被“按下” (类似 HTML 中的 radio)
Scale 进度条 线性“滑块”组件,可设定起始值和结束值,会显示当前位置的精确值
Scrollbar 滚动条 对其支持的组件(文本域、画布、列表框、文本框)提供滚动功能
Spinbox 旋转框 文本框和按钮的结合,允许对值进行调整
Text 文本域 多行文字区域,可用来收集(或显示)用户输入的文字(类似 HTML 中的 textarea)
Toplevel 顶级 类似框架,但提供一个独立的窗口容器

其他 GUI

Tk 接口扩展(Tix)

Python MegaWidgets(PMW)

wxWidgets & wxPython

GTK+ & PyGTK

Tile & Ttk