文章目录
Tkinter详细讲解
pyhton GUI编程之Tkinter详细讲解一
- GUI编程概述
- tkinter整体描述
- 主窗口和布局管理器
- 组件用法
- 事件响应
pyhton GUI编程之Tkinter详细讲解一
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:宽度 H:高度 ±X : 屏幕左(+)右(-)距离 ±Y: 屏幕上(+)下(-)距离 |
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=NSEW)
elif c == 0:
but = Button(root, text=c,height=3, width=10)
but.grid(row=rindex+1, column=cindex, columnspan=2, sticky=NSEW)
elif c == ".":
but = Button(root, text=c, height=3, width=10)
but.grid(row=rindex+1, column=cindex+1, sticky=NSEW)
else:
but = Button(root,text=c, height=3, width=10)
but.grid(row=rindex+1, column=cindex, sticky=NSEW)
root.mainloop()
3.2.1 place()
- 根据组件实例在父容器中的
绝对或相对位置参数
进行布局 - place()方法与grid()方法可以混合使用
- 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”(默认) |
- 示例代码及界面如下:
from tkinter import *
root = Tk()
root.geometry('320x240')
msg1 = Message(root,text='''我的水平起始位置相对窗体0.2,垂直起始位置为绝对位置80像素,我的高度是窗体高度的0.4,宽度是200像素''',relief=GROOVE)
msg1.place(relx=0.2,y=80,relheight=0.4,width=200)
root.mainloop()
感谢阅读 若有错误 敬请见谅 !!!