图形用户界面(Graphical User Interface,GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。Python提供了多个图形开发界面的库,几个常用的库如下:
- tkinter
- wxPython
- Jython
这里主要介绍Python的tkinter库。thinker是Python的标准GUI库。由于tkinter是内置到Python的安装包中的,只要安装好Python之后就能加载tkinter库。对于简单的图形界面使用tkinter可以轻松完成。
首先看一个例子
from tkinter import * # 加载tkinter模块
win = Tk() # 创建以win为句柄的窗口
win.title(string="古诗鉴赏")
Label(win, text="山气日夕佳,飞鸟相与还。").pack()
Button(win, relief=RIDGE, borderwidth=6, text="关闭", command=win.quit).pack(side="bottom")
win.mainloop() # 开始窗口事件循环
运行结果
- 认识tkinter控件
控件名称 | 说明 |
Button | 按钮控件:在程序中显示按钮 |
Canvas | 画布控件:用来画图形,如线条、多边形等 |
Checkbutton | 多选框控件:用于在程序内提供多项选择 |
Entry | 输入控件:定义一个简单的文字输入字段 |
Frame | 框架控件:定义一个窗体,以作为其他控件的容器 |
Label | 标签控件:定义一个文字或是图片标签 |
Listbox | 列表框控件:此控件定义一个下拉方块 |
Menu | 菜单控件:定义一个菜单栏、下拉菜单和弹出菜单 |
Menubutton | 菜单按钮控件:用于显示菜单项 |
Message | 消息控件:定义一个对话框 |
Radiobutton | 单选按钮控件:定义一个单选按钮 |
Scale | 范围控件:定义一个滑动条,来帮助用户设置数值 |
Scrollbar | 滚动条控件:定义一个滚动条 |
Text | 文本控件:定义一个文本框 |
Toplevel | 此控件与Frame控件类似,可以作为其他控件的容器。但是此控件有自己的最上层窗口,可以提供窗口管理接口 |
常用操作:(为了方便演示,此处在一个窗口中完成)
from tkinter import *
win = Tk()
# 创建一个文字与边框距离为20像素的按钮,padx='',command(动作),text(标题文字)
Button(win, padx=20, text="关闭", command=win.quit).pack()
# 边框控件,borderwidth,relief
Button(win, relief=RIDGE,borderwidth=6, text="关闭", command=win.quit).pack()
# 设置鼠标指针的类型,cursor=""
Button(win, cursor="crosshair", text="关闭", command=win.quit).pack()
# 定义Button、Label或Text的高度和宽度height,width
Button(win, height=3, width=10, text="关闭", command=win.quit).pack()
# 定义一个背景颜色为绿色的文字标签background
Label(win, background="#00ff00", text="大漠孤烟直,长河落日圆。").pack()
# 设置文字标签的字体,font
Label(win, font=("细明体", 20, "bold italic underline"), text="举杯邀明月,对影成三人。").pack()
# 设置文本的颜色,foreground
Label(win, foreground="#ff0000", text="海上生明月,天涯共此时。").pack()
win.mainloop()
- 几何位置的设置
tkinter控件都可以使用下列方法来设置控件在窗口内的几何位置。
- pack():将控件放置在父控件内之前,规划此控件在区块内的位置
- grid():将控件放置在父控件内之前,规划此控件成一个表格类型的架构
- place():将控件放置在父控件的特定位置
pack()方法依照其内的属性设置,将控件放置在Frame控件(窗体)或者窗口内,有下列选项
- expand:此选项让控件使用所有剩下的空间。如此当窗口改变大小时,才能让控件使用多余空间。如果expand等于1,当窗口 改变大小时窗体会占满整个窗口剩余的空间。如果expand等于0,当窗口改变大小时窗体保持不变。
- fill:此选项决定控件如何填满parcel的空间,可以是X、Y、BOTH或者NONE,此选项必须在expand等于1时才有作用。当fill等于X时,窗体会占满整个窗口X方向剩余的空间。当fill等于Y时,窗体会占满整个窗口Y方向剩余的空间。当fiil等于BOTH时,窗体会占满整个窗口的剩余空间。当fill等于NONE时,窗体保持不变。
- ipadx,ipady:此选项与fill选项共同使用,来定义窗体内的控件与窗体边界之间的距离。此选项的单位是像素,也可以是其他测量单位,如厘米、英寸等。
- padx,pady:此选项定义控件放置的位置。此选项的单位是像素、也可以是其他测量单位,如厘米、英寸等。
- side:此选项定义控件放置的位置,可以是TOP(靠上对齐)、BOTTOM(靠下对齐)、LEFT(靠左对齐)、RIGHT(靠右对齐)。
使用pack()方法创建窗体与按钮
from tkinter import *
# 主窗口
win = Tk()
# 第1个窗体
frame1 = Frame(win, relief=RAISED, borderwidth=2)
frame1.pack(side=TOP, fill=BOTH, ipadx=10, ipady=10, expand=0)
Button(frame1, text="Button 1").pack(side=LEFT, padx=10, pady=10)
Button(frame1, text="Button 2").pack(side=LEFT, padx=10, pady=10)
Button(frame1, text="Button 3").pack(side=LEFT, padx=10, pady=10)
# 第2个窗体
frame2 = Frame(win, relief=RAISED, borderwidth=2)
frame2.pack(side=BOTTOM, fill=NONE, ipadx='1c', ipady='1c', expand=1)
Button(frame2, text="Button 4").pack(side=RIGHT, padx='1c', pady='1c')
Button(frame2, text="Button 5").pack(side=RIGHT, padx='1c', pady='1c')
Button(frame2, text="Button 6").pack(side=RIGHT, padx='1c', pady='1c')
# 第3个窗体
frame3 = Frame(win, relief=RAISED, borderwidth=2)
frame3.pack(side=LEFT, fill=X, ipadx='0.1i', ipady='0.1i', expand=1)
Button(frame3, text="Button 7").pack(side=TOP, padx='0.1i', pady='0.1i')
Button(frame3, text="Button 8").pack(side=TOP, padx='0.1i', pady='0.1i')
Button(frame3, text="Button 9").pack(side=TOP, padx='0.1i', pady='0.1i')
# 第4个窗体
frame4 = Frame(win, relief=RAISED, borderwidth=2)
frame4.pack(side=RIGHT, fill=Y, ipadx='10p', ipady='10p', expand=1)
Button(frame4, text="Button 10").pack(side=BOTTOM, padx='10p', pady='10p')
Button(frame4, text="Button 11").pack(side=BOTTOM, padx='10p', pady='10p')
Button(frame4, text="Button 12").pack(side=BOTTOM, padx='10p', pady='10p')
# 开始窗口的事件循环
win.mainloop()
运行结果
grid()方法将控件依照表格的栏列方式来放置在窗体或者窗口内,有下列选项
- row:设置控件在表格中的第几列
- column:设置控件在表格中的第几栏
- columnspan:设置控件在表格中合并栏的数目
- rowspan:设置控件在表格中合并列的数目
使用grid()创建5x5安你有数组
from tkinter import *
# 主窗口
win = Tk()
# 创建窗体
frame = Frame(win, relief=RAISED, borderwidth=2)
frame.pack(side=TOP, fill=BOTH, ipadx=5, ipady=5, expand=1)
# 创建按钮数组
for i in range(5):
for j in range(5):
Button(frame, text="("+str(i)+","+str(j)+")").grid(row=i, column=j)
# 开始窗口循环
win.mainloop()
运行结果
place()方法设置控件在窗体或者窗口内的绝对地址或相对地址。有下列选项
- anchor:定义控件在窗体或者窗口内的方位。可以是N、NE、E、SE、S、SW、W、NW或者CENTER。默认值是NW,表示左上角方位。
- bordermode:定义控件的坐标是否要考虑边界的宽度。此选项可以是OUTSIDE或者INSIDE,默认值是INSIDE。
- height:定义控件的高度,单位是像素。
- width:定义控件的宽度,单位是像素。
- in(in_):定义控件相对于参考控件的位置。
- relheight:定义控件相对于参考控件(使用in_选项)的高度。
- relwidth:定义控件相对于参考控件(使用in_选项)的宽度。
- relx:定义控件相对于参考控件(使用in_选项)的水平位移。如果没有设置in_选项,则是相对于父控件。
- rely:定义控件相对于参考控件(使用in_选项)的垂直位移。如果没有设置in_选项,则是相对于父控件。
- x:定义控件的绝对水平位置,默认值是0。
- y:定义控件的绝对垂直位置,默认值是0。
下面使用place()方法创建2个按钮。第1个按钮的位置在距离窗体左上角的(40,40)坐标处,第2个按钮的位置在距离窗体左上角的(140,80)坐标处。按钮的宽度是80个像素,按钮的高度是40个像素。
from tkinter import *
win = Tk()
frame = Frame(win, relief=RAISED, borderwidth=2, width=400, height=300)
frame.pack(side=TOP, fill=BOTH, ipadx=5, ipady=5, expand=1)
# 第一个按钮的位置在距离窗体左上角的(40,40)坐标处
button1 = Button(frame, text="Button 1")
button1.place(x=40, y=40, anchor=W, width=80, height=40)
# 第二个按钮的位置在距离窗体左上角的(140,40)坐标处
button2 = Button(frame, text="Button 2")
button2.place(x=140, y=80, anchor=W, width=80, height=40)
win.mainloop()
运行结果