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()后窗口才会出现。

运行后显示如下:

python tkinter界面开发 tkinter.mainloop_tkinter

(二)主窗口的一些基本操作

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是可选项,以键-值形式设置,并以逗号分隔。

运行后显示如下:

python tkinter界面开发 tkinter.mainloop_ide_02

三、Entry 输入框控件

功能:单行文本框,用于文本输入。

语法格式:entry=Entry(master, option, ...)

entry = tk.Entry(root)
entry.pack()

master是父控件,这里用root。option是可选项。

运行后显示如下:

python tkinter界面开发 tkinter.mainloop_tkinter_03

四、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')

运行后显示如下:


python tkinter界面开发 tkinter.mainloop_python_04

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)

运行后显示如下:

python tkinter界面开发 tkinter.mainloop_python tkinter界面开发_05

参数:

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')

运行后显示如下:

python tkinter界面开发 tkinter.mainloop_python_06

参数:

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()

运行后显示如下:

python tkinter界面开发 tkinter.mainloop_tkinter_07

参数:

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)

运行后显示如下:

python tkinter界面开发 tkinter.mainloop_ide_08

参数:

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)

运行后显示如下:

python tkinter界面开发 tkinter.mainloop_控件_09

参数:

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()

运行后显示如下:

python tkinter界面开发 tkinter.mainloop_python_10

参数:
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未赋值的列会为空值,超过列的长度会被截断。