分享最全Python之tkinter—GUI(图形用户界面)文档!!!(未完成持续更新ing)

   基于tkinter的GUI界面编程

文章目录

 基于tkinter的GUI界面编程
1.1GUI简介
1.2 tkinter库
1.3 tkinter 简介
1.4 导入tkinter库
1.4 创建图形用户界面步骤
2.1 tkinter 库中的组件
2.2 布局组件
3.1 常用组件
3.2 标签组件
3.3 文本框组件
3.4 菜单栏组件
3.4 选择性组件
4.1 时间处理机制
   4.1.1 什么是事件
   1.常用的键盘和鼠标事件
   2.常用的窗口事件

1.1GUI简介

        图形用户界面(Graphical User Interface, GUI, 又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 
        图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其他一一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象。

1.2 tkinter库

(1) tkinter:tkinter 模块(tk 接口)是Python的标准tkGUl工具包的接口。tk 和tkinter可以在大多数的UNIX 平台下使用, 同样可以应用在Windows和Maciontosh 系统里。Tk8.0的后续楼版本可以实现本地宣口风格, 并良好地运行在绝大多数平台中。

1.3 tkinter 简介

tkinter是python 的标准GUI库。只要按照好Python后就可以导入tkinter库。而且IDLE也是用tkinter编写而成。对于简单的图形界面tkinter还是可以应付自如。tk是一个轻量级的跨平台图形用户界面开发工具。

1.4 导入tkinter库

import tkinter
from tkinter import *

1.4 创建图形用户界面步骤

     Python的GUI用户界面有一个主窗口, 这个主窗口中又有各种各样的组件。主窗口和各种组件都称为对象,具有属性和方法。tkinter 图形库是一个基于面向对象思想的用户界面设计工具包,所以要充分掌据面向对象的思想。创建图形化界面的主要步骤如下。

(1)创建主窗口。

(2)添加组件并设置组件属性。

(3)调整对象的位置和大小。

(4)为组件添加事件处理机制。

(5)进入主事件循环。

下面贴出一个案例体验一下:

import tkinter
import tkinter.messagebox #导入对话框类


def main():
    flag = True

    # 修改标签上的文字
    def change_label_text():
        nonlocal flag
        flag = not flag
        color, msg = ('red', 'Hello, world!')\
            if flag else ('blue', 'Goodbye, world!')
        label.config(text=msg, fg=color)

    # 确认退出
    def confirm_to_quit():
        if tkinter.messagebox.askokcancel('温馨提示', '确定要退出吗?'):
            top.quit()

    # 创建顶层窗口
    top = tkinter.Tk()
    # 设置窗口大小
    top.geometry('240x160')
    # 设置窗口标题
    top.title('小游戏')
    # 创建标签对象并添加到顶层窗口
    label = tkinter.Label(top, text='Hello, world!', font='Arial -32', fg='red')
    label.pack(expand=1)
    # 创建一个装按钮的容器
    panel = tkinter.Frame(top)
    # 创建按钮对象 指定添加到哪个容器中 通过command参数绑定事件回调函数
    button1 = tkinter.Button(panel, text='修改', command=change_label_text)
    button1.pack(side='left')
    button2 = tkinter.Button(panel, text='退出', command=confirm_to_quit)
    button2.pack(side='right')
    panel.pack(side='bottom')
    # 开启主事件循环
    tkinter.mainloop()


if __name__ == '__main__':
    main()

在这里插入图片描述

2.1 tkinter 库中的组件

1.组件分类
窗口化界面中的内容都是一个个组件组成,例如按钮、文本框、标签、菜单栏等。目前有十五中组件,下面对这些组件做一个简单的介绍。(纯手打整理,有点小累)

Button 在程序中显示按钮
Canvas 显示图形元素 ,如线条或文本
Checkbutton 用于在程序中提供多项选择框
Entry 用于显示简单文本的内容
Frame 在屏幕上显示一个矩形区域,多用来作为容器
Label 可以显示文本和地图
Listbox 在窗口中的部件是用来显示一个字符串列表给客户
Menubutton 用于显示菜单栏
Menu 显示菜单栏,下拉菜单和弹出菜单
Radiobutton 显示一个单选按钮状态
Scale 显示一个数值刻度,为输出的限定范围的数字区间
Scrollbar 滚动条;当内容超过可视化区域显示
Text 文本控件,显示多行文本
PanedWindow 是一个窗口布局管理的插件,可包含多个子控件
LabelFrame 是一个简单的容器控件
tkMessageBox 用于显示应用程序消息框
Dimension 空间大小
Color 控件颜色
Font 控件字体
Anchor 锚点
Relief 控件样式
Bitmap 位图
Cursor 光标

2.2 布局组件

1.pack布局
使用pack布局,将向容器中添加组件,第一个添加的组件在最上方,然后依次向下添加。pack的常用属性表如下:

属性名 属性简介 取值 取值说明
fill 设置组件是否水平或垂直方向填充 x,y,BOTH和NONE 水平,垂直,水平+垂直,不填充
expand 设置组件是否展开,当值为yes时,side选项无效。组件显示在父容器中心位置;若fill选项BOTH,则填充父组件的剩余空间。默认不展开 yes(1),no(0) expand=YES;expand=NO
side 设置组件的对齐方式 LEFT,TOP,RIGHT,BOTTOM 值为左上右下
ipadx,ipady 设置x方向(或y)外部间隙(与之并列的组件之间的间隔) 可设置数值,默认0 非负整数,单位为像素
padx,pady 设置x方向(或y)外部间隙(与之并列的组件之间的间隔) 可设置数值,默认0 非负整数,单位为像素
anchor 锚选项,当可用空间大于所需求的尺寸时,决定组件被放置于容器的何处 N,ES,W,NW,NE,SW,SE,CENTER(默认) 表示八个方向以及中心

除此之外,pack 类还提供了下列函数(使用组件实例对象调用)。
pack slaves(): 以列表方式返回本组件的所有子组件对象。
pack configure(option-value):给pack布局管理器设置属性,使用属性(option) =取值(value) 方式设置。

propagate(boolean):设置为True 表示父组件的几何大小由子组件决定(默认值),反之则无关。pack info(): 返回pack提供的选项所对应的值。

pack_ forget(): unpack 组件,将组件隐藏并且忽略原有设置,对象依旧存在。

location(x,y): (x,y)为以像素为 单位的点,函数返回此点是否在单元格中,以及在哪个单元格中。返回单元格行列坐标,(-1,-1) 表示不在其中。

2.grid布局
grid布局又被称作网格布局,是大家喜欢使用的布局。我们可以很容易地把它划分为一个几行几列的网格,然后根据行号和列号,将组件放置于网格之中。使用grid 布局时,用row表示行,用column表示列。注意,row 和column的序号都从0开始。grid 的常用属性如表如下:

属性名 属性简介 取值 取值说明
row,column row为行号,column为列,设置将组件放置于第几行第几列 取值为行、列的序号,不是行数和列数 序号取值都为0
sticky 设置组件在网格中的对齐方式 N,ES,W,NW,NE,SW,SE,CENTER(默认) 类似pack布局锚选项
rowspan 组件所跨越的行数 跨越的行数 取值为跨越的行数不是序号
colimnspan 组件所跨越的列数 跨越的列数 取值为跨越的列数不是序号
ipadx,ipady,padx,pady 组件的内部,外部间隔距离,与pack的该属性用法相同 同pack 同pack

除此之外,grid类还提供了下列函数(使用组件实例对象调用)。
grid slavesO:以列表方式返回本组件的所有子组件对象。

grid configure(option= value);:给pack布局管理器设置属性,使用属性(opio) -取值(value)方式设置。

grid propagate(boolean):设置为True表示父组件的几何大小由子组件决定(默认值),反之则无关。grid_ info(): 返回pack提供的选项所对应的值。

grid forget(): unpack 组件,将组件隐藏并且忽略原有设置,对象依旧存在。
grid location(x,y); (x,y)为以像素为 单位的点,函数返回此点是否在单元格中,以及在哪个单元格中。返回单元格行列坐标,(-1,-1) 表示不在其中。

3.place布局
place布局是最简单最灵活的一种布局, 使用组件坐标来放置组件的位置。但是不太推荐使用,在不同分辨率下, 界面往往有较大差异。place 的常用属性如下:

属性名 属性简介 取值 取值说明
anchor 锚选项,同pack 默认NW 同pack
x,y 组件左上角的x,y坐标 整数,默认值0 绝对位置,单位像素
relx,rely 组件相对于父容器的x,y坐标 0-1浮点数 相对位置,0.0表示左边缘(上),1.0表示右边缘(下)
width,height 组件的宽高 非负整数 单位像素
relwidth,relheight 组件相对于父容器的宽度、高度 0-1浮点数 与relx(rely)相似
bordemode 如果设置INSIDE,组件的内部的大小和位置是相对的,不包括边框,如果是OUTSIDE,组件的外部的大小是相对的,包括边框 INSIDE(默认),OUTSIDE 可以使用常量INSIDE,OUTSIDE,也可以使用字符串形式

除此之外,place类还提供了下列函数(用组件实例对象调用).
place_slaves(): 以列表方式返回本组件的所有子组件对象。

place configure(option=value): 给pack布局管理器设置属性,使用属性(option) =取值(value) 方式设置。

propagate(boolean):设置为True表示父组件的几何大小由子组件决定(默认值),反之则无关。

place_ info(): 返回pack提供的选项所对应的值。

place_ forget(): unpack 组件,将组件隐藏并且忽略原有设置,对象依旧存在。

location(xy): (x.y)为以像素为单位的点,函数返回此点是否在单元格中,以及在哪个单元格中。返回单元格行列坐标,(-1,-1) 表示不在其中。

3.1 常用组件

元素 简要说明
Frame 框架 用来承载放置其他GUI元素,就是一个容器
Label 标签 用于显示不可编辑的文本或图标
Button 按钮 点击时执行一个动作
Entry 单行文本框 显示一行文本
Text 多行文本框 显示多行文本
Checkbutton 复选框 允许用户选择或反选一个选项
Radiobuttion 单选框 允许用户从多个选项中选取一个
Canvas 画布 提供绘图功能(直线、椭圆、多边形、矩形) 可以包含图形或位图
Listbox 列表框 一个选项列表,用户可以从中选择
Menu 菜单 点下菜单按钮后弹出的一个选项列表,用户可以从中选择
Menubutton 菜单按钮 用来包含菜单的组件(有下拉式、层叠式等等)
Message 消息框 类似于标签,但可以显示多行文本
Scale 进度条 线性“滑块”组件,可设定起始值和结束值,会显示当前位置的精确值
Scrollbar 滚动条 对其支持的组件(文本域、画布、列表框、文本框)提供滚动功能
Toplevel 顶层 类似框架,为其他的控件提供单独的容器
Spinbox 输入控件 与Entry类似,但是可以指定输入范围值
PanedWindow 窗口布局管理 是一个窗口布局管理的插件,可以包含一个或者多个子控件。
LabelFrame 容器控件 是一个简单的容器控件。常用与复杂的窗口布局
messageBox 消息框 用于显示你应用程序的消息框。(Python2中为tkMessagebox)

按钮组件
按钮(Button)也称命令组件,是图形用户界面最常见的组件,它是用户命令程序进行某项操作的基本手段。一个简单的按钮,用来响应用户的一个单击操作,能够与一个Python函数关联,当按钮被单击时,自动调用该函数。下面的语句表示在 A窗口中添加了一个按钮控件:

btn=Button(A.text=" Quit”),command=A.quit)

其中,属性command是按钮的核心,它一般和函数连用,单击这个按钮时则会触发这个函数执行下一步内容。

示例:创建一个按钮。

from tkinter import *
def onclick():
    print("点击成功!")

root = Tk()
button = Button(root,text='这是一个按钮',fg='black',command=onclick)

button.pack()
root.mainloop()

在这里插入图片描述

3.2 标签组件

  tkinter模块定义了Label 类来创建标签控件。创建标签时需要指定其父控件和文本内容,前者由Label构造函数的第一个 参数指定,后者用属性text指定。

aLabel=Label (A, text=“你好”,bg=“green”, fg=“black”,width=50)

  可以看到标签还有其他属性,例如 bg控制标签背景颜色,fg 控制标签文本颜色,width 控制标签的宽度等。Label用于显示一个文本或图像。
Label 的属性可以直接参考按钮,事实上按钮就是一个特殊的标签,只不过按钮多出了单击相应的功能。如创建一个标签:

from tkinter import *

root = Tk()
label_1 = Label(root,text="我是标签",bg="green",fg="black",width=50)
label_1.pack()
root.mainloop()

在这里插入图片描述

3.3 文本框组件

  文本框(Entry)用于输入和编辑文本。输入过程中随时可以进行编辑,如光标定位、修改、插入等。tkinter模块提供的Entry类可以实现单行文本的输入和编辑。下面的语句创建并布置一个单行文本框控件:

Entry(A).pack

   需要注意一点, Entry 与Lable 和Button不同,其text属性是无效的。当用户输入数据之后,应用程序要用某种方法来获取用户的输入,方便对输入的数据进行处理。可以通过Entry对象中的textvariable属性将文本框与-个StringVar类型的控制变量关联。
   StringVar类属于tkinter, 在界面编程的时候,需要跟踪变量值的变化,以保证值的变更随时可以显示在界面上。由于Python无法做到这一点, 所以使用了tcl 的相应对象,也就是StringVar. StringVar 除了set外还有其他的函数,包括: gct 用于返回StringVar变量的值,trace (mode. callback)用于在某种mode被触发的时候调用callback()函数。
  Entry还可以将其state 属性设置为readonly, 变为只读,则单行文本框不能编辑,变成了显示文字的Label。给个示例:

from tkinter import *

root = Tk()
e = StringVar()

entry = Entry(root,textvariable = e)
e.set('请输入···')
entry.pack()
root.mainloop()

在这里插入图片描述

3.4 菜单栏组件

菜单(Menu)也是常用的控件之一。菜单控件是一个由许多菜单项组成的列表,每一一个菜单项表示一条命令或一个选项。用户则使用鼠标或者键盘对菜单进行操作。tkinter 模块提供Menu类创建菜单组件,具体用法是先创建一个菜单控件对象, 并与某个窗口(主窗口或者顶层窗口)进行关联,然后再为该菜单添加菜单项。不同的菜单项用不同的方法来添加,例如:

简单命令:add_ command()
级联式命令: add cascade()
复选框: add_checkbutton()
单选按钮:add_radiobuttom()
菜单分割线 (使菜单结构更清晰 ):add_separator()

创建一个菜单:

from tkinter import *

root = Tk()
#大窗口下定义一个顶级菜单示例
menubar = Menu(root)
#创建子菜单
fmenu = Menu(menubar)
for each in ['1','2','3','4']:
    fmenu.add_command(label=each)
vmenu = Menu(menubar)
#添加菜单项
for each in ['1','2','3']:
    vmenu.add_command(label=each)
emenu = Menu(menubar)

for each in ['1','2']:
    emenu.add_command(label=each)
emenu = Menu(menubar)


for each in ['1','2']:
    emenu.add_command(label=each)

#为顶级菜单实例添加菜单,并级联相应的子菜单示例
menubar.add_cascade(label='1',menu=fmenu)
menubar.add_cascade(label='2',menu=fmenu)
menubar.add_cascade(label='3',menu=fmenu)
menubar.add_cascade(label='4',menu=fmenu)
#顶级菜单栏实例应用到大窗口
root['menu'] = menubar
root.mainloop()

在这里插入图片描述

3.4 选择性组件

1.单选按钮
选择性组件有单选按钮和复选框,先来了解一下单选按钮, 即在同一组内只能有一个按钮被选中, 每当选中组内的一个按钮时,其他的按钮自动改为非选中态。与其他控件不同的是,它有组的概念。tkinter模块提供的Radiobutton 类可用于创建单选按钮,其语法格式如下:

>>> Radiobutton (A, text="选项一") . pack

该按钮的使用较为简单,同样使用command关联函数,单击时响应。
实际应用中是将多个相关的单选按钮组合成一个组, 使得每次都只能有一个按钮被选中。这需要创建IntVar和StringVar类型的控制变量,然后将同组的每个单选按钮的variable 属性都设置成该控制变量。
由于多个单选按钮共享一个 控制变量,而控制变量只能取一个值,所以选中一个单选按钮就会导致取消另一个。代码示例:

from tkinter import *

def sel():
    selection = "You selected the option " + str(car.get())
    print(selection)

root = Tk()

#创建整型变量,用于绑定,相同的整型变量为同一组

var = IntVar()
R1 = Radiobutton(root,text="Option 1",variable=var,value=1,command=sel)
R1.pack(anchor = W)
R2 = Radiobutton(root,text="Option 2",variable=var,value=2,command=sel)
R2.pack(anchor = W)
R3 = Radiobutton(root,text="Option 3",variable=var,value=3,command=sel)
R3.pack(anchor = W)

root.mainloop()

在这里插入图片描述

4.1 时间处理机制

用户的各种操作(例如按键,移动鼠标等)会产生事件。
事件随时可能发生,而且量也可能会很大,事件处理机制的做法是把一系列的事件存放一 个队列里, 逐个处理。

4.1.1 什么是事件

我们已经了解了图形界面以及其内部的组件如何创建,这只是完成了窗口化程序的前端外观部分,接下来要处理的是图形化界面的另一个重要部分,对所有组件对象进行对应的操作功能。我们在创建按钮时就已经接触了事件,图形化界面就是将界面的对象与程序的执行相关联,产生一种新的程序执行模式。用户可以通过鼠标或者键盘,与图形用户界面进行交互操作,交互发生时会产生各种事件,这些事件就是要对程序进行响应和处理。tkinter 模块中定义了很多种事件,帮助我们开发图形化程序。事件描述的一般形式是:

<修饰符>-<类型符>-<细节符>1.常用的键盘和鼠标事件

1.常用的键盘和鼠标事件

< Button-1> 鼠标左键按下,2表示中键,3表示右键同上
< ButtonPress-1> 同上
< ButtonRelease- 1> 鼠标左键释放
< B1-Motion> 按住鼠标左键移动

< Double-Button-1>双击左键
< Enter> 鼠标指针进入某一组件区域
< Leave>鼠标指针离开某一组件区域
< MouseWheel> 滚动滑轮
< KeyPress-A> 按下A键,A可用其他键代替
< Alt-KeyPress-A> 同时按下Alt+ A ;Alt可用Ctrl和Shift 替代
< Double-KeyPress-A > 快速按两下A
< Lock-KeyPress-A> 大写状态下按A
< Key> 键盘的任意按键

2.常用的窗口事件

Activate :当组件由不可用转为可用时触发
Configure:当组件大小改变时触发
Deactivate:当组件由可用转变为不可用时触发
Destroy :当组件被销毁时触发
Expose: 当组件从被遮挡状态中暴露出来时触发
Unmap: 当组件由显示状态变为隐藏状态时触发
Map:当组件由隐藏状态变为显示状态时触发
FocusIn:当组件获得焦点时触发
FocusOut:当组件失去焦点时触发
Property:当窗体的属性被删除或改变时触发
Visibility:当组件变为可视状态时触发

对话框

使用标准对话框时会发现,对话框其实就是一个新的窗口,那么要想自定义一个对话框,便可以使用创建窗口的方法。先创建一个顶级窗口,向其中添加的需要的控件和事件属于自己的简单对话框。示例:

from tkinter import *

def msg():
    top = Toplevel(width=400,height=200)
    Lavel(topmtext="点击成功").pack()

w = Tk()
Button(w,text="点击",command=msg).pack()
w.mainloop()

在这里插入图片描述

终于结束了,纯手敲代码和文字,如果有文字错误的地方,及时告知up立即修正···
分享到这里,希望能帮助到一起学python的朋友。


注:
参考书目 《 Python从入门到项目实践 ( 超值版 ) 》
创作 : 聚慕课教育研发中心

原创文章 27 获赞 34 访问量 2614

猜你喜欢

转载自blog.csdn.net/weixin_46313446/article/details/105645836