当前位置: 首页 > 工具软件 > pyrasite-gui > 使用案例 >

Python 的GUI

孟楷
2023-12-01

常用的 GUI 库

  1. Tkinter tkinter(Tk interface)是 Python 的标准 GUI 库,支持跨 平台的 GUI 程序开发。tkinter 适合小型的 GUI 程序编写, 也特别适合初学者学习 GUI 编程。
  2. wxPython wxPython是比较流行的GUI库,适合大型应用程序开发, 功能强于 tkinter,整体设计框架类似于 MFC(Microsoft Foundation Classes 微软基础类库)。
  3. PyQT Qt 是一种开源的 GUI 库,适合大型 GUI 程序开发,PyQT 是 Qt 工具包标准的 Python 实现。

GUI 编程的核心步骤和第一个 GUI 程序

基于 tkinter 模块创建 GUI 程序包含如下 4 个核心步骤:

  1. 创建应用程序主窗口对象(也称:根窗口)
    (1) 通过类 Tk 的无参构造函数
from tkinter import * 
root = Tk() 
  1. 在主窗口中,添加各种可视化组件,比如:按钮(Button)、 文本框(Label)等。
btn01 = Button(root)
btn01["text"] = "点我就送花" 
  1. 通过几何布局管理器,管理组件的大小和位置
btn01.pack() 
  1. 事件处理 (1) 通过绑定事件处理程序,响应用户操作所触发的事件 (比如:单击、双击等)
def songhua(e): 
	messagebox.showinfo("Message","送你一朵玫瑰花,请 你爱上我") 
	print("送你 99 朵玫瑰花") 
btn01.bind("<Button-1>",songhua)

下面是一个完整的程序:

from tkinter import * 
from tkinter import messagebox 

root = Tk()
btn01 = Button(root) 
btn01["text"] = "点我就送花" 
btn01.pack() 
def songhua(e): 
	messagebox.showinfo("Message","送你一朵玫瑰花,请你爱 上我")
	print("送你 99 朵玫瑰花") 

btn01.bind("<Button-1>",songhua) 
root.mainloop() #调用组件的 mainloop 方法,进入事 件循环 

tkinter 主窗口

主窗口位置和大小
通过 geometry(‘wxh±x±y’)进行设置。w 为宽度,h 为高度。 +x 表示距屏幕左边的距离;-x 表示距屏幕右边的距离;+y 表示距屏幕上边的距离;-y 表示距屏幕下边的距离。

GUI 编程整体描述

图形用户界面是由一个个组件组成,就像小孩“搭积木”一样最终组成了整个界面。有 的组件还能在里面再放置其他组件,我们称为“容器”。
常用组件汇总列表

Tkinter 类名称简介
Toplevel顶层容器类,可用于为其他组件提供单独的容器;Toplevel 有点 类似于窗口
Button按钮代表按钮组件 Canvas 画布 提供绘图功能,包括直线、矩形、椭圆、多边形、位图等
Checkbutton复选框可供用户勾选的复选框
Entry单行输入框用户可输入内容
Frame容器用于装载其它 GUI 组件
Label标签用于显示不可编辑的文本或图标
LabelFrame容器也是容器组件,类似于 Frame,但它支持添加标题
Listbox列表框列出多个选项,供用户选择
Menu菜单菜单组件
Menubutton菜单按钮用来包含菜单的按钮(包括下拉式、层叠式等)
OptionMenu菜单按钮Menubutton 的子类,也代表菜单按钮,可通过按钮打开一个 菜单
Message消息框 类似于标签,但可以显示多行文本;后来当 Label 也能显示
多行文本之后,该组件基本处于废弃状态
PanedWindow分区窗口该容器会被划分成多个区域,每添加一个组件占一个区域, 用户可通过拖动分隔线来改变各区域的大小
Radiobutton单选钮可供用户点边的单选钮
Scale滑动条拖动滑块可设定起始值和结束值,可显示当前位置的精确值
Spinbox微调选择器用户可通过该组件的向上、向下箭头选择不同的值
Scrollbar滚动条用于为组件(文本域、画布、列表框、文本框)提供滚动功能
Text多行文本框显示多行文本

Label 标签
Label(标签)主要用于显示文本信息,也可以显示图像。
Label(标签)有这样一些常见属性:

  1. width,height: 用于指定区域大小,如果显示是文本,则以单个英文字符 大小为单位(一个汉字宽度占 2 个字符位置,高度和英文 字符一样);如果显示是图像,则以像素为单位。默认值 是根据具体显示的内容动态调整。
  2. font 指定字体和字体大小,如:font = (font_name,size)
  3. image: 显示在 Label 上的图像,目前 tkinter 只支持 gif 格式。
  4. fg 和 bg fg(foreground):前景色、bg(background):背景色
  5. justify 针对多行文字的对齐,可设置 justify 属性,可选值"left", “center” or “right”

Options 选项详解
通过学习 Label 组件,我们发现可以通过 Options 设置组件的属性,从而控制组件的各 种状态。比如:宽度、高度、颜色、位置等等。 我们可以通过三种方式设置 Options 选项,这在各种 GUI 组件中用法都一致。

  1. 创建对象时,使用可变参数 fred = Button(self, fg=“red”, bg=“blue”)
  2. 创建对象后,使用字典索引方式 fred["fg"] = "red" fred["bg"] = "blue"
  3. 创建对象后,使用 config()方法fred.config(fg="red", bg="blue")

我们将常见的选项汇总如下:

选项名(别名)含义
activebackground指定组件处于激活状态时的背景色
activeforeground指定组件处于激活状态时的前景色
anchor指定组件内的信息(比如文本或图片)在组件中如何显示(当所在组件比信 息大时,可以看出效果)。必须为下面的值之一:N、NE、E、SE、S、SW、 W、NW 或 CENTER。比如 NW(NorthWest)指定将信息显示在组件的左上角
background(bg)指定组件正常显示时的背景色
bitmap指定在组件上显示该选项指定的位图,该选项值可以是 Tk_GetBitmap 接收的任何形式的位图。位图的显示方式受 anchor、justify 选项的影响。如果 同时指定了 bitmap 和 text,那么 bitmap 覆盖文本;如果同时指定了 bitmap 和 image,那么 image 覆盖 bitmap
borderwidth指定组件正常显示时的 3D 边框的宽度,该值可以是 Tk_GetPixels 接收的任 何格式
cursor指定光标在组件上的样式。该值可以是 Tk_GetCursors 接受的任何格式
command指定按组件关联的命令方法,该方法通常在鼠标离开组件时被触发调用
disabledforeground指定组件处于禁用状态时的前景色
font指定组件上显示的文本字体
foreground(fg)指定组件正常显示时的前景色
highlightbackground指定组件在高亮状态下的背景色
highlightcolor指定组件在高亮状态下的前景色
highlightthickness指定组件在高亮状态下的周围方形区域的宽度,该值可以是 Tk_GetPixels 接收的任何格式
height指定组件的高度,以 font 选项指定的字体的字符高度为单位,至少为 1
image指定组件中显示的图像,如果设置了 image 选项,它将会覆盖 text、bitmap 选项
justify指定组件内部内容的对齐方式,该选项支持 LEFT(左对齐)、CENTER(居 中对齐)或 RIGHT(右对齐)这三个值
padx指定组件内部在水平方向上两边的空白,该值可以是 Tk_GctPixels 接收的 任何格式
pady指定组件内部在垂直方向上两地的空白,该值可以是 Tk_GctPixels 接收的 任何格式
relief指定组件的 3D 效果,该选项支持的值包括 RAISED、SUNKEN、FLAT、 RIDGE、SOLID、GROOVE。该值指出组件内部相对于外部的外观样式, 比如 RAISED 表示组件内部相对于外部凸起
selectbackground指定组件在选中状态下的背景色
selectborderwidth指定组件在选中状态下的 3D 边框的宽度,该值可以是 Tk_GetPixels 接收的 任何格式
selectforeground指定组在选中状态下的前景色
state指定组件的当前状态。该选项支持 NORMAL(正常)、DISABLE(禁用) 这两个值
takefocus指定组件在键盘遍历(Tab 或 Shift+Tab)时是否接收焦点,将该选项设为 1 表示接收焦点;设为 0 表示不接收焦点
text指定组件上显示的文本,文本显示格式由组件本身、anchor 及 justify 选 项决定
textvariable指定一个变量名,GUI 组件负责显示该变量值转换得到的字符串,文本显 示格式由组件本身、anchor 及 justify 选项决定
underline指定为组件文本的第几个字符添加下画线,该选项就相当于为组件绑定了 快捷键
width指定组件的宽度,以 font 选项指定的字体的字符高度为单位,至少为 1
wraplength对于能支持字符换行的组件,该选项指定每行显示的最大字符数,超过该数量的字符将会转到下行显示
xscrollcommand通常用于将组件的水平滚动改变(包括内容滚动或宽度发生改变)与水平 滚动条的 set 方法关联,从而让组件的水平滚动改变传递到水平滚动条
yscrollcommand通常用于将组件的垂直滚动改变(包括内容滚动或高度发生改变)与垂直 滚动条的 set 方法关联,从而让组件的垂直滚动改变传递到垂直滚动条

Button
Button(按钮)用来执行用户的单击操作。Button 可以包含 文本,也可以包含图像。按钮被单击后会自动调用对应事件 绑定的方法。
Entry 单行文本框
Entry 用来接收一行字符串的控件。如果用户输入的文字 长度长于 Entry 控件的宽度时, 文字会自动向后滚动。如果 想输入多行文本, 需要使用 Text 控件。
Text 多行文本框
Text(多行文本框)的主要用于显示多行文本,还可以显示 网页链接, 图片, HTML 页面, 甚至 CSS 样式表,添加组件 等。因此,也常被当做简单的文本处理器、文本编辑器或者 网页浏览器来使用。比如 IDLE 就是 Text 组件构成的。
·利用 Tags 实现更加强大的文本显示和控制
Tags 通常用于改变 Text 组件中内容的样式和功能。你 可以修改文本的字体、尺寸和颜色。另外,Tags 还允许你 将文本、嵌入的组件和图片与鼠标和键盘等事件相关联。
Radiobutton 单选按钮
Radiobutton 控件用于选择同一组单选按钮中的一个。 Radiobutton 可以显示文本,也可以显示图像。
Checkbutton 复选按钮
Checkbutton 控件用于选择多个按钮的情况。Checkbutton 可以显示文本,也可以显示图像。
canvas 画布
canvas(画布)是一个矩形区域,可以放置图形、图像、 组件等。

布局管理器

grid 布局管理器
grid 表格布局,采用表格结构组织组件。子组件的位置由 行和列的单元格来确定,并且可以跨行和跨列,从而实现复 杂的布局。
grid()方法提供的选项

选项说明取值范围
column单元格的列号从 0 开始的正整数
columnspan跨列,跨越的列数正整数
row单元格的行号从 0 开始的正整数
rowspan跨行,跨越的行数正整数
ipadx, ipady设置子组件之间的间隔,x 方向或者 y 方向, 默认单位为像素非负浮点数,默认 0.0
padx, pady与之并列的组件之间的间隔,x 方向或者 y 方向,默认单位是像素非负浮点数,默认 0.0
sticky组件紧贴所在单元格的某一角,对应于东南 西北中以及 4 个角“n”, “s”, “w”, “e”, “nw”, “sw”, “se”, “ne”, “center”(默认)

pack 布局管理器
pack 按照组件的创建顺序将子组件添加到父组件中,按 照垂直或者水平的方向自然排布。如果不指定任何选项,默 认在父组件中自顶向下垂直添加组件。
pack()方法提供的选项

名称描述取值范围
expand当值为“yes”时,side 选项无效。组件显示在父配件中心位置;若 fill 选项为”both”,则填充父组件的剩余空间“yes”, 自然数,”no”, 0(默认值”no” 或 0)
fill填充 x(y)方向上的空间,当属性 side=”top”或”bottom”时,填充 x 方向;当属性 side=”left”或”right”时,填充”y”方向;当 expand 选 项为”yes”时,填充父组件的剩余空间“x”, “y”, “both”,“none” (默认值为 none)
ipadx, ipady设置子组件之间的间隔,x 方向或者 y 方向,默认单位为像素非负浮点数,默认 0.0
padx, pady与之并列的组件之间的间隔,x 方向或者 y 方向,默认单位是像素非负浮点数,默认 0.0
side定义停靠在父组件的哪一边上“top”,“bottom”,“left”,“right” (默认为”top”)
before将本组件于所选组建对象之前 pack,类似于先创建本组件再创建选定 组件已经 pack 后的组件对象
after将本组件于所选组建对象之后 pack,类似于先创建选定组件再本组件已经 pack 后的组件对象
in_将本组件作为所选组建对象的子组件,类似于指定本组件的 master 为选定组件已经 pack 后的组件对象
anchor对齐方式,左对齐”w”,右对齐”e”,顶对齐”n”,底对齐”s”“n”, “s”, “w”, “e”, “nw”, “sw”, “se”, “ne”, “center”(默认)

place 布局管理器

place 布局管理器可以通过坐标精确控制组件的位置,适用 于一些布局更加灵活的场景。
place()方法的选项

选项说明取值范围
x,y组件左上角的绝对坐标 (相对于窗口)非负整数 x 和 y 选项用于设置偏移(像素),如果同时设置 relx(rely) 和 x(y),那么 place 将优先计算 relx 和 rely,然后再实现 x 和 y 指定的偏移值
relx rely组件左上角的坐标 (相对于父容器)relx 是相对父组件的位置。0 是最左边,0.5 是正中间,1 是最右边; rely 是相对父组件的位置。0 是最上边,0.5 是正中间,1 是最下边;
width, height组件的宽度和高度非负整数
relwidth, relheight组件的宽度和高度 (相对于父容器)与 relx、rely 取值类似,但是相对于父组件的尺寸
anchor对齐方式,左对齐”w”, 右对齐”e”,顶对齐”n”, 底对齐”s”“n”, “s”, “w”, “e”, “nw”, “sw”, “se”, “ne”, “center”(默认)

事件处理

一个 GUI 应用整个生命周期都处在一个消息循环 (event loop) 中。它等待事件的发生,并作出相应的处理。 Tkinter 提供了用以处理相关事件的机制. 处理函数可被绑 定给各个控件的各种事件。 widget.bind(event, handler) 如果相关事件发生, handler 函数会被触发, 事件对象 event 会传递给 handler 函数.
鼠标和键盘事件

代码说明
<Button-1> <ButtonPress-1> <1>鼠标左键按下。 2 表示右键,3 表示中键;
<ButtonRelease-1>鼠标左键释放
<B1-Motion>按住鼠标左键移动
<Double-Button-1>双击左键
<Enter>鼠标指针进入某一组件区域
<Leave>鼠标指针离开某一组件区域
<MouseWheel>滚动滚轮
<KeyPress-a>按下 a 键,a 可用其他键替代
<KeyRelease-a>释放 a 键。
<KeyPress-A>按下 A 键(大写的 A)
<Alt-KeyPress-a>同时按下 alt 和 a;alt 可用 ctrl 和 shift 替代
<Double-KeyPress-a>快速按两下 a
<Control-V>CTRL 和 V 键被同时按下,V 可以换成其它键位

event 对象常用属性

名称说明
char按键字符,仅对键盘事件有效
keycode按键编码,仅对键盘事件有效
keysym按键名称,仅对键盘事件有效 比如按下空格键: 键的 char: 键的 keycode:32 键的 keysym:space 比如按下 a 键: 键的 char:a 键的 keycode:65 键的 keysym:a
num鼠标按键,仅对鼠标事件有效
type所触发的事件类型
widget引起事件的组件
width,height组件改变后的大小,仅 Configure 有效
x,y鼠标当前位置,相对于父容器
x_root,y_root鼠标当前位置,相对于整个屏幕

多种事件绑定方式汇总

·组件对象的绑定

  1. 通过 command 属性绑定(适合简单不需获取 event 对象)
    Button(root,text=”登录”,command=login)
  2. 通过 bind()方法绑定(适合需要获取 event 对象) c1 = Canvas(); c1.bind(“”,drawLine)
    ·组件类的绑定
    调用对象的 bind_class 函数,将该组件类所有的组件绑定事件: w.bind_class(“Widget”,”event”,eventhanler)
 类似资料: