121.4_python_tkinter初探GUI


GUI-tkinter

2021年10月7日

22:04

GUI类似于搭积木,将一个个Widget(组件)堆叠组合。

https://docs.python.org/zh-cn/3.9/library/tk.html

大型应用使用wxPython,PyQT是开源的QT的python版本。

DAY1 THE OPEN

创建根窗口

1
2
import tkinter as tk
rootwindow = Tk()

在窗口中添加可视化组件

1
2
button01 = Button(rootwindow)
button01["text"]="这是一个可以点击的按钮"

Tkinter 组件

Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用。这些控件通常被称为控件或者部件。

目前有15种Tkinter的部件。我们提出这些部件以及一个简短的介绍,在下面的表:

控件 描述

Button 按钮控件;在程序中显示按钮。

Canvas 画布控件;显示图形元素如线条或文本

Checkbutton 多选框控件;用于在程序中提供多项选择框

Entry 输入控件;用于显示简单的文本内容

Frame 框架控件;在屏幕上显示一个矩形区域,多用来作为容器

Label 标签控件;可以显示文本和位图

Listbox 列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户

Menubutton 菜单按钮控件,用于显示菜单项。

Menu 菜单控件;显示菜单栏,下拉菜单和弹出菜单

Message 消息控件;用来显示多行文本,与label比较类似

Radiobutton 单选按钮控件;显示一个单选的按钮状态

Scale 范围控件;显示一个数值刻度,为输出限定范围的数字区间

Scrollbar 滚动条控件,当内容超过可视化区域时使用,如列表框。.

Text 文本控件;用于显示多行文本

Toplevel 容器控件;用来提供一个单独的对话框,和Frame比较类似

Spinbox 输入控件;与Entry类似,但是可以指定输入范围值

PanedWindow PanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件。

LabelFrame labelframe 是一个简单的容器控件。常用与复杂的窗口布局。

tkMessageBox 用于显示你应用程序的消息框。

几何布局管理器管理组件的大小和位置

1
button01.pack()

几何管理

Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,以下是Tkinter公开的几何管理类:包、网格、位置

几何方法 描述

pack() 包装;

grid() 网格;

place() 位置;

事件处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def reaction_after_click(e)

messagebox.showinfo("Message","我感受到你点击了我的按钮")

print("牛蛋")

button01.bind("<Button-1>",reaction_after_click)

#将事件【reaction_after_click】绑定在button01上。

 

from tkinter import *

from tkinter import messagebox

rootwindow = Tk()

 

button01 = Button(rootwindow) # 将btn01放到rootwindow

button01["text"]="这是一个可以点击的按钮"

 

button01.pack()

 

def reaction_after_click(e):

messagebox.showinfo("Message","我感受到你点击了我的按钮")

print("牛蛋")
 

button01.bind("<Button-1>",reaction_after_click)

rootwindow.mainloop() # 调用组件的mainloop进入时间循环(就是一直监听事件)

主窗口大小和位置

$geometry(‘wxh+x+y’)

500x300+100+200距离左边100上边200;

500x300-100-200同理。

GUI编程整体描述

继承结构

Wm进行窗口通信。

TopLevel顶级窗口。

Pack、Place、Grid位置管理(都由组件继承)。

行 文 本 之 后 。 该 组 件 基 本 处 于 废 有 状 态  容 器 会 啵 划 分 我 多 个 区 域 . 每 添 加 . 拿 付 占  W № “ 卜 区  用 0 可 通 过 动 分 隔 线 来 改 度 各 凶 城 餉 大 小  供 用 尸 点 边 的 单 选  . 个 区 域 ·  动 条 飧 动 滑 块 呵 没 定 值 和 结 4 : 可 显 小 当 正 位 的 帻 确 值  《 《 《 《 《 两 选 择 器 户 可 通 过 该 组 件 的 向 上 . 下 箭 头 选 择 不 同 的 值  用 于 为 组 件 《 文 本 域 . 布 · 列 表 框 . 文 车 框 》 提 供 滚 动  Scrollbar 家 条  文 本 框  一 多 行 文 本

面向对象写法

Frame 用来放其他组件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Test2.py

============>>

#测试面向对象的写法

from tkinter import *

calss application(Frame):

#一个检点的GUI写法

def __init__(self, master=None

):

super().__init__(master) #不主动调用不行,super()代表父对象的定义而不是父类对象

self.master = master

self.pack()

 

self.creatWidget()

 

def creatWidget(self):

pass

 

 

root = Tk()

root.geometry("400x300+200+200")

app = Application(master =root

)# 告诉构造器的master

root.mainloop()

 

创建roottk---app继承frame不会自动调用构造器)【虚拟的代表app对象master=root---app又定义一个master等于调用的master---对象frame和root绑定了

 

 

def creatWidget(self):

# 创建组件

self.btn01 = Button(self)

self.btn01["text"] = "这是一个按钮"

# 或

self.btn01=Button(self,text="这是一个按钮")

#同理 构建一个退出按钮

self.btnQuit = Button(self, text="Quit", command=root.destroy)

self.btnQuit.pack() #将按钮封装到frame(root)
DAY1 THE END

CTRL-/