pyhton GUI编程之Tkinter详细讲解一

本文深入介绍了Python的GUI库Tkinter,包括GUI编程基础、Tkinter类结构、主窗口管理及布局策略。详细讲解了pack、grid和place布局管理器的使用方法,并通过实例展示了如何创建组件、响应事件。此外,还探讨了Tkinter在大型应用程序中的角色与其他GUI库的对比。
摘要由CSDN通过智能技术生成

Tkinter详细讲解

pyhton GUI编程之Tkinter详细讲解一

  1. GUI编程概述
  2. tkinter整体描述
  3. 主窗口和布局管理器

pyhton GUI编程之Tkinter详细讲解二

  1. 组件用法

pyhton GUI编程之Tkinter详细讲解三

  1. 事件响应

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()

在这里插入图片描述


感谢阅读 若有错误 敬请见谅 !!!


  • 3
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

园长QwQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值