Tkinter 是 Python 的标准 GUI 库,它是一个跨平台的脚本图形界面接口,且可以快速的创建 GUI 应用程序。由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能导入 import Tkinter 库,Tkinter能够开发各种图形界面。
一、Tkinter的Tk主窗口
(一)创建主窗口
import tkinter as tk #导入tkinter模块,仅用于Python3
root = tk.Tk() #创建主窗口
root.title('演示窗口') #设置窗口标题
root.geometry('500x300') # 设置窗口大小
root.mainloop() # 主循环
通过Tk()创建主窗口,一般用root或window表示主窗口。title()设置窗口的标题,geometry()设置窗口的大小。最后用mainloop()创建主循环,启动mainloop()后窗口才会出现。
运行后显示如下:
(二)主窗口的一些基本操作
1.获取屏幕和窗口信息
screenwidth = root.winfo_screenwidth() #获取屏幕宽度(单位:像素)
screenheight = root.winfo_screenheight() #获取屏幕高度(单位:像素)
win_width = root.winfo_width() #获取窗口宽度(单位:像素)
win_height = root.winfo_height() #获取窗口高度(单位:像素)
x=root.winfo_x() #获取窗口x坐标(单位:像素)
y=root.winfo_y() #获取窗口y坐标(单位:像素)
2.窗口移动到屏幕中央
--snip--
def setCenter(root,w,h):
'''设置主窗口在屏幕中央'''
ws = root.winfo_screenwidth()
hs = root.winfo_screenheight()
x = int( (ws/2) - (w/2) )
y = int( (hs/2) - (h/2) )
root.geometry('{}x{}+{}+{}'.format(w, h, x, y)) #改变窗口位置和大小
--snip--
setCenter(root,500,300) #把主窗口移动到屏幕中央,主窗口大小500X300
3.改变窗口图标
root.iconbitmap(‘image.ico’) #改变窗口图标
iconbitmap(bitmap)可以将羽毛图标换成其他图标,参数bitmap是包含路径的ico文件名。
二、Label标签控件
功能:在指定的窗口中显示文本和图像。
语法格式:label=tk.Label ( master, option, ... )
label = tk.Label(root, text="这是要显示的内容文字")
label.pack()
master是父控件,这里用root。option是可选项,以键-值形式设置,并以逗号分隔。
运行后显示如下:
三、Entry 输入框控件
功能:单行文本框,用于文本输入。
语法格式:entry=Entry(master, option, ...)
entry = tk.Entry(root)
entry.pack()
master是父控件,这里用root。option是可选项。
运行后显示如下:
四、pack布局
功能:pack()方法将控件按添加顺序放置在父控件内。
语法格式:w.pack(option=value, ...)
button1 = tk.Button(root, text='button1').pack(side='top')
button2 = tk.Button(root, text='button2').pack(side='top')
button3 = tk.Button(root, text='button3').pack(side='top', padx=13, pady=13)
button4 = tk.Button(root, text='button4').pack(side='bottom', fill='both')
运行后显示如下:
pack按照语句的先后顺序进行执行,依照side命令进行排布,依照anchor进行锚定或者对齐,side缺省值是top,anchor的缺省值是center,但会受到side影响。
参数:
1)
expand
:此选项让控件使用所有剩下的空间。如此当窗口改变大小时,才能让控件使用多余的空间。如果 expand 等于 True,当窗口改变大小时,窗体就会占满整个窗口剩余的空间;如果 expand 等于 False,当窗口改变大小时,窗体就维持不变。
2)
fill
:此选项决定控件如何填满空间,可以是 X、Y、BOTH 或 NONE,此选项必须在 expand 等于 True才有作用。当 fill 等于 X 时,窗体会占满整个窗口 X 方向剩余的空间;当 fill 等于 Y 时,窗体会占满整个窗口 Y 方向剩余的空间;当 fill 等于 BOTH 时,窗体会占满整个窗口剩余的空间;当 fill 等于 NONE 时,窗体维持不变。
3)
ipadx,ipady
:此选项与 fill 选项共同使用,以定义窗体内的控件与窗体边界之间的距离。此选项的单位是像素,也可以是其他测量单位,如厘米、英寸等。
4)
padx,pady
:此选项定义控件之间的距离,单位是像素,也可以是其它测量单位,如厘米、英寸等。
5)
side
:此选项定义控件放置的位置,可以是 TOP(靠上对齐)、BOTTOM(靠下对齐)、LEFT(靠左对齐)或RIGHT(靠右对齐)。
6)
anchor
:此选项定义控件的位置对齐,可以是N,E,S,W或者它们的组合,或者是 CENTER(表示中间)。N,E,S,W原本英文方向的首字母,这里代表上下左右。N:北,上,顶;S:南,下,底;W:西,左;E:东,右。口诀“上北下南左西右东”。
pack ()根据我们在代码中添加控件的顺序依次排列所有控件,非常简单方便,适用于少量组件或简单布局的情况。pack()方法不能和grid()方法混用。
五、grid布局
功能:grid() 方法将控件依照表格的行列方式,放置在父控件内。
格式:w.grid(option=value, ...)
colors = ['red', 'yellow', 'blue', 'green', 'purple', 'orange']
for i, color in enumerate(colors):
label = tk.Label(root, text=i, bg=color)
label.grid(row=0, column=i, padx=10, ipadx=15, pady=5)
button = tk.Button(root, text='登录', padx=20).grid(columnspan=6)
运行后显示如下:
参数:
1)
row
:此选项设置控件在表格中的第几列。
2)
column
:此选项设置控件在表格中的第几栏。
3)
columnspan
:此选项设置控件在表格中合并栏的数目。
4)
rowspan
:此选项设置控件在表格中合并列的数目。
5)
sticky
:此选项设置子控件对齐的位置,用 N,E,S,W 表示上右下左。
六、place布局
功能:place() 方法定义控件在父控件内绝对位置或相对位置。
语法:w.place(option=value, ...)
tk.Label(root, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor='center')
tk.Label(root, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor='center')
tk.Label(root, bg="blue").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor='center')
运行后显示如下:
参数:
1)
relx
:指定该组件相对于父组件的水平位置,取值范围 0.0 ~ 1.0。
2)
rely
:指定该组件相对于父组件的垂直位置,取值范围 0.0 ~ 1.0。
3)
relheight
:指定该组件相对于父组件的高度,取值范围 0.0 ~ 1.0。
4)
relwidth
:指定该组件相对于父组件的宽度,取值范围 0.0 ~ 1.0。
5)
x
:指定该组件的水平偏移位置(像素),如同时指定了 relx 选项,优先实现 relx 选项。
6)
y
:指定该组件的垂直偏移位置(像素),如同时指定了 rely 选项,优先实现 rely 选项。
7)
width
:指定该组件的宽度(像素)。
8)
height
:指定该组件的高度(像素)。
9)
anchor
:控制组件在 place 分配的空间中的位置,"n", "ne", "e", "se", "s", "sw", "w", "nw", 或 "center" 来定位(ewsn代表东西南北,上北下南左西右东),默认值是 "nw"。
七、button按钮控件
功能:添加按钮,按钮上可以放上文本或图像,按钮可用于监听用户行为,能够与一个 Python 函数关联,当按钮被按下时,自动调用该函数。
语法:button = Button ( master, option=value, ... )
def button_command():
print("你点击了按钮")
# 绑定普通事件
button = tk.Button(root, text='确定', command=button_command).pack()
def sum_fun(a, b):
result = a + b
print("%d + %d = %d" % (a, b, result))
# 传递参数事件
button = tk.Button(root, text="传值事件", command=lambda: sum_fun(1, 3)).pack()
运行后显示如下:
参数:
1)
font
:设置字体与字体的大小。
2)
fg
:前景色,也就是字体的颜色,
bg
:背景颜色。
3)
width
height
:标签的宽度与高度,都是以系统默认的中文的一个字体宽高为单位。
4)
cursor
:鼠标移动到按钮上指针的样式。pencil:笔型,circle:圆形,hand1:手型1,
hand2:手型2。
5)
command
:按钮的事件绑定。
普通的Button绑定事件
:使用 command=功能函数(),来绑定 事件,Button(win, text="确定", command=功能函数);
传参数Button绑定事件
: 使用command=lambda: 功能函数(var1, var2, ……),来传递参数。
八、frame框架控件
功能:Frame俗称框架,用来承载放置其他GUI元素,可以理解为一个容器。它能将 Windows 分成不同的区,然后存放不同的部件。同时一个Frame 也能再分成多个子Frame。在有不同的界面逻辑层级和功能区域划分时可以用到,让交互界面逻辑更加清晰。
语法:w = Frame ( master, option, ... )
frame1 = tk.Frame(root)
frame2 = tk.Frame(root)
label= tk.Label(frame1,text="框架1", bg='red', bd=1, relief='groove', width=100).pack()
label= tk.Label(frame2,text="框架2", bg='blue', bd=1, pady=30).pack()
frame1.pack(padx=10,pady=50)
frame2.pack(padx=10,pady=10)
运行后显示如下:
参数:
1)
bg
或 background:frame组件的背景颜色
2)
bd
或 borderwidth:frame的边框宽度,默认值为0
3)
cursor
:鼠标移动到框架时,光标的形状,可以设置为 arrow, circle, cross, plus 等。
4)
width
:frame组件的宽度
5)
height
:frame组件的高度
6)
padx
:frame的X方向的内边距
7)
pady
:frame的Y方向的内边距
8)
relief
:frame的样式.可选的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。
默认为 FLAT。
九、Notebook选项卡控件
功能:ttk.Notebook笔记本组件类似多页的Frame,通过点击顶部标签的选项卡选择不同容器。
语法:w= ttk.Notebook(parent,option= value,...)
tabControl = ttk.Notebook(root)
tab1 = tk.Frame(tabControl, bg='blue')
tabControl.add(tab1, text='选项卡1')
tab2 = tk.Frame(tabControl, bg='yellow')
tabControl.add(tab2, text='选项卡2')
tabControl.pack(fill='both', expand=True)
运行后显示如下:
参数:
1)
height
:默认是使用最大可能高度,如果设置数值则使用设置高度。
2)
padding
:设置Notebook外围的额外空间,可以设置4个数值代表left、top、
right、bottom四周的空间。
3)
width
:默认是使用最大可能宽度,如果设置数值则使用设置宽度。
方法:
tabControl.add(child, text="xxx", **kw)
功能:将子对象插入notebook,同时产生"xxx"选项卡名称
十、TreeView树状图
功能:TreeView组件是一个树状结构和表格的结合体。第一列是树状结构,后几列是列表。每一行表示一个item,树的item可以分级,每个item有子item,名称对应text标签。每一行的值用values元组里的值表示。
语法:tree = ttk.Treeview(parent)
import tkinter as tk
from tkinter import ttk
def setCenter(root,w,h):
'''设置主窗口在屏幕中央'''
ws = root.winfo_screenwidth()
hs = root.winfo_screenheight()
x = int( (ws/2) - (w/2) )
y = int( (hs/2) - (h/2) )
root.geometry('{}x{}+{}+{}'.format(w, h, x, y)) #改变窗口位置和大
root = tk.Tk()
root.title('演示窗口')
root.geometry('500x300')
setCenter(root,500,300)
columns = ['学号', '姓名', '性别', '年龄', '班级']
tree = ttk.Treeview(root, columns=columns, show='headings')
tree.heading('学号', text='学号')
tree.heading('姓名', text='姓名')
tree.heading('性别', text='性别')
tree.heading('年龄', text='年龄')
tree.heading('班级', text='班级')
tree.column('学号', width=100, minwidth=100, anchor='center')
tree.column('姓名', width=100, minwidth=100, anchor='center')
tree.column('性别', width=100, minwidth=100, anchor='center')
tree.column('年龄', width=100, minwidth=100, anchor='center')
tree.column('班级', width=100, minwidth=100, anchor='center')
info = [
['001', '张三', '男', '18', '7班'],
['002', '李四', '男', '18', '7班'],
['003', '王五', '男', '19', '6班'],
['004', '赵六', '男', '18', '6班'],
for data in info:
tree.insert('', 'end', values=data)
tree.pack(expand=True, fill='both')
root.mainloop()
运行后显示如下:
参数:
1)
columns
:值是一个列表。列表里每个元素代表一个列标识符的名称。列表的长度为列的长度。
2)
height
:表示要显示几行数据(注意:这个部件的宽度是根据列的多少自动定义的)
3)
show
:表示这个部件显示哪种功能,“tree”表示仅显示第一列(单树模式),“headings”表示显示除一列的其他列(单列表模式),默认是"tree headings",显示所有列。
方法:
1)
heading
:heading(column, option=None, **kw),查询或修改指定列的标题选项。第一个column是列标识符。第二个option,如果不设置则返回所有属性的字典,如果设置则返回那个属性的值。kw里的option有4个,text:列头名;image: 列头名右的图像;anchor:文字在heading里的对齐方式,标准的tk的anchor属性;command:点击列头的回调函数。
2)
column
:column(column, option=None, **kw),给各列设置属性,或返回属性。第一个column是列标识符。第二个option,如果不设置则返回所有属性的字典,如果设置则返回那个属性的值。kw里的option有5个,id:只读属性,返回列名;anchor:文字在cell里的对齐方式,标准的tk的anchor属性;minwidth: 值,单位是像素,列的最小宽度;stretch: 布尔值,表示列的宽度是否随整个部件的改动而变化;width:列宽,单位是像素。(提示:如果要设置树状结构那列,用column=“#0”。)
3)
insert
:insert(parent, index, iid=None, **kw),创建新item并返回新创建item的项标识符。parent:用item ID表示父item,或者‘’表示根item。index:数值int,或‘end’,表示item插入的位置。iid:item标识符,可自动生成。kw的option:text:树状结构这边的名称。image:树状结构这边的名称的左边加个图。values:列表结构这边每一行的值,values未赋值的列会为空值,超过列的长度会被截断。