python GUI编程之Tkinter详解合集
python GUI编程之Tkinter详细讲解一
文章目录 :
- 1. GUI编程概述
- 1.1 GUI含义及Tkinter介绍
- 1.2 常见的GUI库
- 1.3 tkinter GUI开发核心步骤
- 2 thinker 整体描述
- 2.1 类继承关系图
- 2.2 相关类的简单解释
- 2.3 标准的GUI程序类的写法模板
- 3 主窗口和布局管理器
- 3.1 主窗口大小位置方法
- 3.2 布局管理器
1. GUI编程概述
1.1 GUI含义及Tkinter介绍
- GUI:Graphic User Interface,
图形用户界面编程
,即通过鼠标对菜单、按钮等图形化元素触发指令,并从标签
、对话框
等图型化显示容器中获取人机对话信息。 - tkinter 模块 :Python自带了 tkinter 模块,实质上是一种流行的面向对象的GUI工具包
TK
的 Python 编程接口,提供了快速便利地创建GUI应用程序的方法。
1.2 常见的GUI库
- 常见的GUI库
- tkinter : 基础,小型程序编写
- wxPython : 大型应用程序开发
- PyQT : 开源库,大型应用程序开发
1.3 tkinter GUI开发核心步骤
- 图像化编程的基本步骤通常包括: (1) 导入
tkinter
模块 (2) 创建根窗口,并添加各种可视化组件 (3) 对组件进行几何布局,管理组件的大小和位置 (4) 编写相应的函数并和对应的组件进行绑定 (5) 在主事件循环中等待用户触发事件响应
2 thinker 整体描述
2.1 类继承关系图
继承关系
2.2 相关类的简单解释
类 |
名称 |
简介 |
Misc,Wm |
组件根父类 |
所有组件根父类,提供窗口管理器通信功能函数 |
TK |
主窗口 |
编辑主窗口 |
Pack,Place,Grid |
布局管理器 |
管理组件大小,位置 |
BaseWidget,Widget |
所有组件父类 |
所有组件父类 |
Toplevel |
顶层 |
容器类,可用于为其他组件提供单独的容器;Toplevel 有点类似于窗口 |
Button |
按钮 |
代表按钮组件 |
Canvas |
画布 |
提供绘图功能,包括直线、矩形、椭圆、多边形、位图等 |
Checkbutton |
复选框 |
可供用户勾选的复选框 |
Entry |
单行输入框 |
用户可输入内容 |
Frame |
容器 |
用于装载其它GUI 组件 |
Label |
标签 |
用于显示不可编辑的文本或图标 |
LabelFrame |
容器 |
也是容器组件,类似于Frame,但它支持添加标题 |
Listbox |
列表框 |
列出多个选项,供用户选择 |
Menu |
菜单 |
菜单组件 |
Menubutton |
菜单按钮 |
用来包含菜单的按钮(包括下拉式、层叠式等) |
OptionMenu |
菜单按钮 |
Menubutton 的子类,也代表菜单按钮,可通过按钮打开一个菜单 |
Message |
消息框 |
类似于标签,但可以显示多行文本;后来当Label 也能显示多行文本之后,该组件基本处于废弃状态 |
PanedWindow |
分区窗口 |
该容器会被划分成多个区域,每添加一个组件占一个区域,用户可通过拖动分隔线来改变各区域的大小 |
Radiobutton |
单选钮 |
可供用户点边的单选钮 |
Scale |
滑动条 |
拖动滑块可设定起始值和结束值,可显示当前位置的精确值 |
Spinbox |
微调选择器 |
用户可通过该组件的向上、向下箭头选择不同的值 |
Scrollbar |
滚动条 |
用于为组件(文本域、画布、列表框、文本框)提供滚动功能 |
Text |
多行文本框 |
显示多行文本 |
2.3 标准的GUI程序类的写法模板
from
tkinter
import
*
from
tkinter
import
messagebox
class
Application(Frame):
"""
一个经典的GUI程序的类的写法
"""
def
__init__(self,
master
=
None):
super().__init__(master)
# 父类继承的定义
self.master
=
master
self.pack()
self.createWidget()
def
createWidget(self):
"""
创建组件
"""
self.btn01
=
Button(self)
# 创建按钮
self.btn01["text"]
=
"点击按钮"
self.btn01.pack()
self.btn01["command"]
=
self.event
# 事件绑定
self.btnQuit
=
Button(self,
text="退出",
command
=
root.destroy)
# 创建一个退出按钮
self.btnQuit.pack()
def
event(self):
messagebox.showinfo("event","这是一个消息弹出界面")
if
__name__
==
'__main__':
root
=
Tk()
root.geometry("400x100+200+300")
root.title("一个经典的GUI程序类的测试")
app
=
Application(master=root)
root.mainloop()
3 主窗口和布局管理器
3.1 主窗口大小位置方法
方法名 |
说明 |
使用方法 |
参数说明 |
geometry |
设置大小及位置 |
tk.geometry("WxH±X±Y") |
W:宽度 |
title |
主窗口名字 |
root.title("QWQ的工具箱") |
主窗口显示:QWQ的工具箱 |
- 示例代码
from
tkinter
import
*
# 导入tkinter模块
root
=
Tk()
# 创建主窗口对象
root.title("QWQ的工具箱")
# 设计主窗口名字
root.geometry("500x300+100+100")
# 主窗口尺寸,WxH±X±Z
root.mainloop()
# 调用组件的mainloop方法,进入事件循环
- 显示示意图
3.2 布局管理器
- 组件的布局通常有
pack()
、grid()
和place()
三种方法
3.2.1 pack()
pack()
方法
:一种简单的布局方法,如果不加参数的默认方式,将按布局语句的先后,以最小占用空间的方式自上而下地排列控件实例,并且保持控件本身的最小尺寸。- 使用方法:
组件对象
.pack(fill= "X",side = "LEFT" )
- pack()方法的所有属性参数(fill 和side最常用):
名称 |
描述 |
取值范围 |
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”(默认) |
from
tkinter
import
*
root
=
Tk()
lbred
=
Label(root,text="Red",fg="Red",relief=GROOVE)
lbred.pack()
lbgreen
=
Label(root,text="绿色",fg="green",relief=GROOVE)
lbgreen.pack(side
=
RIGHT)
lbblue
=
Label(root,text="蓝",fg="blue",relief=GROOVE)
lbblue.pack(fill
=
X)
root.mainloop()
3.2.1 grid()
grid()
方法
:基于网格的布局,先虚拟一个二维表格,再在表格中布局控件
实例。由于在虚拟表格的单元中所布局的控件实例大小不一,单元格也没有固定或均一的大小,因此其仅用于布局的定位
- pack()方法与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”(默认) |
- 利用grid 布局 - 实现计算器软件界面代码示例:
from
tkinter
import
*
root
=
Tk()
root.title("GUI 计算器")
root.geometry("500x500+100+100")
btnText
=
(
("MC","M+","M-","MR"),
("C","±","/","✖ "),
(7,8,9,"-"),
(4,5,6,"+"),
(1,2,3,"="),
(0,"."))
Entry(root,
width=50).grid(row=0,
column=0,
columnspan=4,
pady=10)
# 布局上方显示窗口
for
rindex,
r
in
enumerate(btnText):
# 布局按钮输入窗口
for
cindex,
c
in
enumerate(r):
if
c
==
"=":
but
=
Button(root,
text=c,
height=3,
width=10)
but.grid(row=rindex+1,
column=cindex,
rowspan=2,
sticky