Python编程之Tkinter的使用01

Tkinter

Python提供了多个图形开发界面的库,几个常用Python GUI库如下:

  • TkinterTkinter模块(Tk 接口)是Python的标准 Tk GUI 工具包的接口.TkTkinter可以在大多数的Unix平台下使用, 同样可以应用在WindowsMacintosh系统里。Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
  • wxPythonwxPython是一款开源软件,是Python语言的一套优秀的GUI图形库,允许Python程序员很方便的创建完整的、功能健全的GUI用户界面。
  • JythonJython程序可以和Java无缝集成。除了一些标准模块,Jython使用Java的模块。Jython 几乎拥有标准的Python中不依赖于C 语言的全部模块。比如,Jython的用户界面将使用 SwingAWT或者SWTJython 可以被动态或静态地编译成Java字节码

Tkinter介绍

  • TkinterPython的标准GUI库。Python使用 Tkinter可以快速的创建GUI应用程序。
  • 由于Tkinter是内置到python的安装包中、只要安装好Python之后就能import Tkinter库、而且IDLE也是用Tkinter编写而成、对于简单的图形界面Tkinter还是能应付自如

需要注意: `Python3.x`版本使用的库名为 `tkinter`,即首写字母`T`为小写

1
import tkinter
  • 创建一个GUI程序
    • 1、导入tkinter模块
    • 2、创建控件
    • 3、指定这个控件的master,即这个控件属于哪一个
    • 4、告诉GM(geometry manager)有一个控件产生了

主窗口

  • iOS中每一个APP都有一个主窗口window, 该window就是所有视图嘴地城最基础的视图View
  • Python中童谣也会有一个主窗口, 下面看一下tkinter生成主窗口的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 主窗口
import tkinter

# 创建主窗口
window = tkinter.Tk()

# 设置标题
window.title('Titanjun')

# 设置窗口大小
window.geometry('400x400')

# 进入消息循环
window.mainloop()

效果如下

window

主窗口除了上述方法之外还有以下方法

1
2
3
4
5
6
7
8
# 框体大小的可调性, 分别表示x, y方向的可变性
window.resizable(0, 0)

# 退出
window.quit()

# 刷新页面
window.update()

Tkinter组件

  • Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用, 这些控件通常被称为控件或者部件
  • 目前有15种Tkinter的部件, 下面是对这些部件以及一个简短的介绍
控件 描述
Label 标签控件, 可以显示文本和位图
Button 按钮控件, 在程序中显示按钮
Entry 输入控件;用于显示简单的文本内容
Checkbutton 多选框控件;用于在程序中提供多项选择框
Frame 框架控件;在屏幕上显示一个矩形区域,多用来作为容器
Canvas 画布控件;显示图形元素如线条或文本
Listbox 列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户
Menubutton 菜单按钮控件,由于显示菜单项。
Menu 菜单控件;显示菜单栏,下拉菜单和弹出菜单
Message 消息控件;用来显示多行文本,与label比较类似
Radiobutton 单选按钮控件;显示一个单选的按钮状态
Scale 范围控件;显示一个数值刻度,为输出限定范围的数字区间
Scrollbar 滚动条控件,当内容超过可视化区域时使用,如列表框
Text 文本控件;用于显示多行文本
Spinbox 输入控件;与Entry类似,但是可以指定输入范围值
PanedWindow 一个窗口布局管理的插件,可以包含一个或者多个子控件
LabelFrame 一个简单的容器控件, 常用与复杂的窗口布局
tkMessageBox 用于显示你应用程序的消息框

如果之前做过H5前端开发或者iOS等页面相关开发工作的, 应该能到, 其实这些组件和其他开发语言提供的组件功能相似, 属性也类似, 下面我们先看一下一些通用的属性介绍

属性值 属性描述
bg 控件的背景颜色
fg 组件中的字体颜色
font 设置文本的字体样式和字号
height 设置控件高度
width 设置控件宽度
bd 设置控件边框的大小, 默认2个像素
relief 设置边框样式, 有falt, sunken, raised, groove, ridge, 默认flat
text 设置文本内容
anchor 瞄点, 控制文本的位置, 默认居中(可选: n北, e东, s南, w西, center居中, ne se, sw, nw)
justify 显示多行文本的时候,设置不同行之间的对齐方式(left, right, center)
wraplength 根据宽度限制控件每行显示的字符的数量
underline 下划线, 默认没有; 取值就是带下划线的字符串索引,为 0 时,第一个字符带下划线
padx 在x轴方向上的内边距(padding),是指控件的内容与控件边缘的距离
pady 在y轴方向上的内边距(padding)

Label控件

  • Label控件用以显示文字和图片.
  • Label通常被用来展示信息, 而非与用户交互
  • Label也可以绑定点击等事件, 只是通常不这么用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
label = tkinter.Label(window,
text="我是一只小鸭子",
bg='#999999',
fg='white',
font=('黑体', 13),
justify='center',
height=5,
width=30,
anchor='n',
# wraplength=30
underline=3,
bd=3,
relief='flat'
)
#显示出来
label.pack()

显示效果

Label

部分属性介绍

  • anchor: 文本在空间中的显示位置(按上北下南, 左西右东规则), 可选值有(n北 e东 s南 w西 center居中 ne西北 se东南 sw西南 nw东北)方向
  • image: 显示的图片

Button控件

  • Button控件是一个标准的Tkinter小部件,用于各种按钮, 如果用鼠标点击按钮,可能会开始一些操作
  • Button可以显示文本和图片
  • 按钮只能以单一字体显示文本, 文本可以跨越多行
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
# 设置标题
window.title('Titanjun')

# 设置窗口大小
window.geometry('400x400')

# 创建按钮
button1 = tkinter.Button(window,
text='按钮1',
bg='orange',
height=3,
width=20,
bd=3,
relief='sunken',
activebackground='orange',
activeforeground='white',
command=action1
)
button1.pack()


button2 = tkinter.Button(window, text='Titanjun', height=3, command=window.quit())
button2.pack()

# 进入消息循环
window.mainloop()

效果样式

Button

部分属性介绍

  • activebackground: 当鼠标放上去时,按钮的背景色
  • activeforeground: 当鼠标放上去时,按钮的文本颜色
  • highlightcolor: 要高亮的颜色
  • image: 按钮上要显示的图片
  • state: 设置按钮组件状态,可选的有(normal(默认), active, disabled)
  • command: 按钮的绑定函数方法, 接受一个函数名,注意函数名不要加引号

Entry输入

输入控件, 用于显示简单的文本内容, 和iOS中的UITextField一样, 示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vari = tkinter.Variable()
entry = tkinter.Entry(window, textvariable=vari)
entry.pack()

# 设置值
vari.set('very good')
# 取值
print(vari.get())
print(entry.get())

# 只读输入框
vari2 = tkinter.Variable()
entry2 = tkinter.Entry(window, textvariable=vari2, state='disabled')
entry2.pack()

# 设置值
vari2.set('very bad')
print(vari2.get())

# 密码输入框, 无论输入什么都显示密文
vari3 = tkinter.Variable()
entry3 = tkinter.Entry(window, textvariable=vari3, show='@', bg='red', fg='white')
entry3.pack()

效果样式

Button

监听输入框内文字的改变

  • 这里我们需要通过设置一下三个选项
  • validate: 设置输入框的监听状态
    • focus:当Entry组件获得或失去焦点的时候验证
    • focusin: 当Entry组件获得焦点的时候验证
    • focusout: 当Entry组件失去焦点的时候验证
    • key:当输入框被编辑的时候验证
    • all: 当出现上边任何一种情况的时候验证
  • validatecommand: 接受一个判断输入框内的文字是否符合要求的函数, 该函数只能返回 True 或 False 表示验证的结果
  • invalidcommand: 指定的函数只有在validatecommand的返回值为False的时候才被调用
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
# 主窗口
import tkinter

# 验证输入的文字
def varileText():
text = entry4.get()
if text == '1':
print('对喽')
return True
print('错漏')
return False

#
def testInvaild():
print('invaildCommanf被调用')
return True

# 创建主窗口
window = tkinter.Tk()
# 设置标题
window.title('Titanjun')
# 设置窗口大小
window.geometry('400x400')


# 验证输入的内容是否符合要求
vari4 = tkinter.Variable()
entry4 = tkinter.Entry(window, textvariable=vari4, validate='key', validatecommand=varileText, invalidcommand=testInvaild)
entry4.pack()

# 进入消息循环
window.mainloop()

Text多行文本

  • Text文本组件用于显示和处理多行文本。
  • Tkinter的所有组件中,Text组件显得异常强大和灵活,它适用于处理多任务
  • 当创建一个Text组件的时候里面是没有内容的。为了给其插入内容,可以使用insert()以及INSERTEND索引号

插入文本/控件/图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
text = Text(window, bg='yellow', width=40, height=10)
#INSERT索引表示在光标处插入
text.insert(INSERT,'I Love')
#END索引号表示在最后插入
text.insert(END,' you')
text.pack()

def show():
print('好了, 你赢了')

# text还可以插入按钮 图片等
b1 = Button(text, text='点我点我', command=show)
# 在text创建组件的命令
text.window_create(INSERT, window=b1)

索引值

  • Indexes(索引)是用来指向Text组件中文本的位置,跟python的序列索引一样,Text的组件索引也是对应实际字符之间的位置
  • 值得注意的是: 行号以1开始 列号以0开始
  • 例如: 2.4表示第2行第4列的字符
1
2
3
4
5
6
from tkinter import *
root = Tk()
text1=Text(root,width=30,height=3)
text1.insert(INSERT,'index的练习')
#1.2到1.5的范围之间
print(text1.get(1.2,1.5))

Text中的Tags

Tags通常用于改变Text组件中内容的样式和功能,你可以修改文本的字体,尺寸和颜色,另外Tags还允许你将文本、嵌入的组件和图片与键盘相关联,除了user-defined tags(用户自定义的Tags)

1
2
3
4
5
6
7
8
9
10
11
text.insert(INSERT, '自定义标签的名字')

#第一个参数为自定义标签的名字
#第二个参数为设置的起始位置,第三个参数为结束位置
#第四个参数为另一个位置
text.tag_add('tag1', '1.7', '1.12', '1.14')

#用tag_config函数来设置标签的属性(这里不要用简写, 否则报错)
text.tag_config('tag1', font=17, background='blue', foreground='red')
# text.tag_config('tag1', bg='yellow', fg='red')
#新的tag会覆盖旧的tag

带滚动条

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
text = Text(window, bg='yellow', width=100, height=10)
# 添加右侧滚动条
scroll = Scrollbar()
# side放到窗体的那一侧 fill填充
scroll.pack(side=RIGHT, fill=Y)
text.pack(side=RIGHT, fill=Y)
# 两者关联
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)

str = '''致橡树--舒婷

..........此处省略N个字...........

'''

text.insert(INSERT, str)

效果样式

Button

Checkbutton多选按钮

  • Checkbutton可以表示两种状态:OnOff,可以设置回调函数,每当点击此按钮时回调函数被调用
  • 这里有一个示例: 选择不同的复选框, 会有不同的文本显示
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
def update():
message = ''
if tag1.get() == True:
message += 'titan \n'
if tag2.get() == True:
message += 'jun \n'
if tag3.get() == True:
message += 'coder \n'

#清除text中的所有内容
text.delete(0.0, END)
# 插入新的文本内容
text.insert(INSERT, message)

# 要绑定的变量
tag1 = BooleanVar()
check1 = Checkbutton(window, text = 'Titan', variable = tag1, command = update)
check1.pack()

tag2 = BooleanVar()
check2 = Checkbutton(window, text = 'Juned', variable = tag2, command = update)
check2.pack()

tag3 = BooleanVar()
check3 = Checkbutton(window, text = 'Coder', variable = tag3, command = update)
check3.pack()


text = Text(window, bg = 'orange', width = 50, height = 5)
text.pack()

效果样式

Checkbutton

Radiobutton单选框

Radiobutton为单选按钮,即在同一组内只能有一个按钮被选中,每当选中组内的一个按钮时,其它的按钮自动改为非选中态,与其他控件不同的是:它有组的概念

1
2
3
4
5
6
7
8
9
10
11
def selectorAction():
print(tag.get())

# 一组单选框要绑定同一个变量
tag = IntVar()
radio1 = Radiobutton(window, text = 'one', value = 23, variable = tag, command = selectorAction)
radio1.pack()
radio2 = Radiobutton(window, text = 'two', value = 32, variable = tag, command = selectorAction)
radio2.pack()
radio3 = Radiobutton(window, text = 'ten', value = 10, variable = tag, command = selectorAction)
radio3.pack()

效果样式

Checkbutton

未完待续, 后期会继续更新其他控件的相关介绍……….