Tkinter
是Python
的标准GUI
库。Python
使用 Tkinter
可以快速的创建GUI
应用程序。
- 由于
Tkinter
是内置到python
的安装包中、只要安装好Python
之后就能import Tkinter
库、而且IDLE
也是用Tkinter
编写而成、对于简单的图形界面Tkinter
还是能应付自如
- 上一篇文章介绍了
Tkinter
模块和Button
, Label
等部分控件
- 这里主要介绍
Listbox
, Scale
, Menu
, Frame
等部分控件的使用
- GitHub代码示例目地址
Listbox
列表框
一个可以包含一个或多个文本项的列表框,可以设置为单选或多选
创建Listbox
1 2
| lb = Listbox(window, selectmode = EXTENDED) lb.pack()
|
selectmode
: 设置列表框的样式(默认值-BROWSE
), 有四个可选项
SINGLE
: 单选, 不能通过鼠标的移动选中新的item
, 只能点选
BROWSE
: 单选, 可以通过鼠标的移动选中新的位置(item
并不会移动)
MULTIPLE
: 多选, 但是只能通过鼠标点击进行多选
EXTENDED
: 多选, 按住Shift
可以实现连选, 按住Control
可以实现多选
添加元素
Listbox
使用insert
来添加一个元素,其中参数一为添加的索引值, 参数二为要添加的元素
- 索引
ACTIVE
是向当前选中的item
前插入一个(即使用当前选中的索引作为插入位置)
- 索引
END
是想最后添加一个元素
1 2 3 4 5 6 7 8 9 10 11 12 13
| for item in ["good", "nice", "handsome", "vg", "vn"]: lb.insert(END, item)
lb.insert(ACTIVE, 'Titn')
lb.insert(END, 'jun')
lb.insert(2, 'lululu')
lb.insert(ACTIVE, [1, 2, 3])
lb.insert(ACTIVE, ('che', '09'))
|
删除/选中
1
| def selection_set(self, first, last=None):
|
- 该函数为选中操作的函数, 需要两个参数, 其中
- 参数1: 开始的索引值
- 参数2: 结束的索引值(可选值, 可不指定)
- 若不指定参数2, 则函数只对参数1的索引值进行操作
- 删除/取消选中/取值等函数类似
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
|
lb.selection_set(2, 5) lb.selection_set(0)
lb.selection_clear(3, 4) lb.selection_clear(0)
print(lb.size())
print(lb.get(1, 3)) print(lb.get(5))
print(lb.curselection())
print(lb.selection_includes(3)) print(lb.selection_includes(5))
|
变量和事件绑定
- 变量绑定和之前的控件帮定变量一样
Listbox
不支持command
属性来设置回调函数了,使用bind
来指定回调函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| lbv = StringVar() lb = Listbox(window, selectmode = SINGLE, listvariable = lbv) lb.pack()
for item in ["good", "nice", "handsome", "jun", "titan"]: lb.insert(END, item)
print(lbv.get()) print(lb.get(1))
def listboxAction(event): print(lb.get(lb.curselection()))
lb.bind('<Double-Button-1>', listboxAction)
|
滚动显示
Listbox
的内容超过所容纳范围时, 内容需要滚动显示, 类似上文中提到的Text
文本的多行显示, 这里就需要添加滚动条
1 2 3 4 5 6 7 8 9 10 11 12
| lb = Listbox(window, selectmode=EXTENDED) for item in ["good", "nice", "handsome", "from", "thinter","good1", "nice1", "handsome1", "vg1", "vn1","good3", "nice3", "handsome3", "vg3", "vn3"]: lb.insert(END, item)
sc = Scrollbar(window) sc.pack(side = RIGHT, fill = Y) lb.configure(yscrollcommand = sc.set) lb.pack(side = LEFT, fill = BOTH)
sc["command"] = lb.yview
|
Scale
拽指示器
供用户通过拖拽指示器改变变量的值,可以水平,也可以竖直, 下面是相关属性介绍
from_
: 设置最小值
to
: 设置最大值
resolution
: 步距, 每次移动增加的最小单位
orient
: 显示方向(水平-HORIZONTAL
, 垂直-Variable
)
variable
: 绑定变量
command
: 绑定回调函数
length
: 控件的长度(垂直方向上则是高度)
digits
: 控制显示的数字位数
1 2 3 4 5 6 7 8 9 10 11
| scale = Scale(window, from_ = 0, to = 100, orient = HORIZONTAL, length = 200, label='choice:') scale.pack()
scale.set(34)
def showNumber(event): print(scale.get())
scale["command"] = showNumber
|
Spinbox
数值范围控制器
- 组件
Spinbox
和组件Scale
类似, 都是根据需求显示一个范围内的内容
- 区别:
Spinbox
去能拖拽, 只能点击增加或减少; Scale
可以拖拽选择
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| spinStr = StringVar()
def updateAction(): print(spinStr.get())
'''属性介绍: from_: 起始值 to: 最大值 increment: 步长 textvariable: 绑定变量 command: 绑定函数, 事件监听 values: 设置后, 每次更新值将使用values指定的值 '''
spin1 = Spinbox(window, values=[0, 10, 30, 50, 80, -9], increment = 10, textvariable = spinStr, command = updateAction, bg='red') spin1.pack()
|
Menu
是被用来显示在标题栏/窗口或者其他顶层窗口上的菜单栏
顶层菜单
添加菜单项, 单纯的添加之后没有任何效果
1 2 3
| menubar = Menu(window) window.configure(menu=menubar)
|
下面给菜单添加菜单列表选项, 添加之后只有菜单列表, 但是每一个菜单却没有下拉列表
1 2 3 4 5 6 7
| menu1 = Menu(menubar, tearoff=False)
menubar.add_cascade(label='语言', menu=menu1)
menu2 = Menu(menubar, tearoff=False) menubar.add_cascade(label='颜色', menu=menu2)
|
给每一个菜单添加下拉列表和监听事件
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
| def menuAction1(): print('menubar')
menubar = Menu(window) window.configure(menu=menubar)
menu1 = Menu(menubar, tearoff=False)
for item in ['Python', 'PHP', 'CPP', 'C', 'Java', 'JavaScript', 'VBScript', 'Exit']: if item == 'Exit': menu1.add_separator() menu1.add_command(label=item, command=window.quit) else: menu1.add_command(label=item, command=menuAction1)
menubar.add_cascade(label='语言', menu=menu1)
def menuAction2(): print(menuStr.get())
menuStr = StringVar()
menu2 = Menu(menubar, tearoff=True) for item in ['red', 'orange', 'blue', 'gray']: menu2.add_radiobutton(label=item, variable=menuStr, command=menuAction2)
menubar.add_cascade(label='颜色', menu=menu2)
|
tearoff
是控制菜单能否独立出来的属性, 取值有True
和False
tearoff
设置为True
以后,就是表明这个菜单是可以独立出来的,如果是False
的话就不可以独立出来
- 我在
Mac
中尝试了一下, 发现没有什么效果; 在Windows
系统中会有一条虚线, 点击虚线, 会跳出一个悬浮菜单; 有Windows
系统的童鞋可以试一下
右键菜单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| menubar2 = Menu(window)
menu3 = Menu(menubar2, tearoff=False) for item in ['Python', 'PHP', 'CPP', 'C', 'Java', 'JavaScript', 'VBScript', 'Exit']: menu3.add_command(label=item)
menubar2.add_cascade(label='开发语言', menu=menu3)
def showMenu(event): print('window') menubar2.post(event.x_root, event.y_root)
window.bind("<Button-2>", showMenu)
|
添加删除菜单
菜单中每一项的删除和添加都是根据索引操作的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| def menuClick(): print("menu3")
menu3.insert_command(1, label='command', command=menuClick)
menu3.insert_radiobutton(3, label='radiobutton', command=menuClick)
menu3.insert_checkbutton(5, label='checkbutton', command=menuClick)
menu3.insert_separator(4)
menu3.delete(2, 4) menu3.delete(0)
|
Combobox
下拉控件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| cv = StringVar() combo = ttk.Combobox(window, textvariable=cv) combo.pack()
combo['value'] = ('杭州', '湖州', '温州', '嘉兴', '舟山')
combo.current(0)
def comboboxClick(event): print(cv.get()) print(combo.get())
combo.bind('<<ComboboxSelected>>', comboboxClick)
|
Frame
布局
Frame
就是屏幕上的一块矩形区域,多是用来作为容器(container
)来布局窗体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| frame = Frame(window) frame.pack()
leftFrame = Frame(frame) Label(leftFrame, text='左上位置', bg='red', height=5, width=10).pack(side=TOP) Label(leftFrame, text='左下位置', bg='yellow', height=5, width=10).pack(side=TOP) leftFrame.pack(side=LEFT)
rightFrame = Frame(frame) Label(rightFrame, text='右上位置', bg='orange', height=5, width=10).pack(side=TOP) Label(rightFrame, text='右下位置', bg='blue', height=5, width=10).pack(side=TOP) rightFrame.pack(side=RIGHT)
|
- 至此,
Tkinter
的大部分组件已经基本都介绍完了
- 接下来将会介绍一些
Tkinter
涉及到的数据类型和布局方式
- 以及鼠标的点按事件和一些特殊的事件操作
- 未完待续………….