图形化界面设计(GUI)
当前流行的计算机桌面应用程序大多数为图形化用户界面(Graphic User Interface,GUI),即通过鼠标对菜单、按钮等图形化元素触发指令,并从标签、对话框等图型化显示容器中获取人机对话信息。
Python自带了tkinter 模块,实质上是一种流行的面向对象的GUI工具包 TK 的Python编程接口,提供了快速便利地创建GUI应用程序的方法。其图像化编程的基本步骤通常包括:
- 导入 tkinter 模块
- 创建 GUI 根窗体
- 添加人机交互控件并编写相应的函数。
- 在主事件循环中等待用户触发事件响应。
窗口创建及布局
做界面,首先需要创建一个窗口,Python Tkinter 创建窗口很简单,代码如下:
from tkinter import *
#初始化Tk()
myWindow = Tk()
#进入消息循环
myWindow.mainloop()
上述程序创建的窗口是非常简陋的,有待进一步美化,设置标题、窗口大小、窗口是否可变等,涉及属性有:title(设置窗口标题)、 geometry(设置窗口大小)、resizable(设置窗口是否可以变化长 宽)。请看如下实例:
from tkinter import Tk
#初始化Tk()
myWindow = Tk()
#设置标题
myWindow.title('Python GUI')
#设置窗口大小
myWindow.geometry('500x300')
#设置窗口是否可变长、宽,True:可变,False:不可变
myWindow.resizable(width=False, height=True)
#进入消息循环
myWindow.mainloop()
紧接着,还可以将窗口放置于屏幕中央,如下实例:
from tkinter import Tk
#初始化Tk()
myWindow = Tk()
#设置标题
myWindow.title('Python GUI')
#设置窗口大小
width = 500
height = 300
#获取屏幕尺寸以计算布局参数,使窗口居屏幕中央
screenwidth = myWindow.winfo_screenwidth()
screenheight = myWindow.winfo_screenheight()
alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2)
myWindow.geometry(alignstr)
#设置窗口是否可变长、宽,True:可变,False:不可变
myWindow.resizable(width=False, height=True)
#进入消息循环
myWindow.mainloop()
常用控件
仅有窗口并不能实现交互,还需要控件,Tkinter 提供了各种控件,如按钮、标签和文本框。在一个 GUI 应用程序中使用,这些控件通常被称为控件或者部件,目前有15种Tkinter 部件,如下列表:
控件 | 名称 | 作用 |
Button | 按钮 | 显示按钮,单击触发事件 |
Canvas | 画布 | 绘制图形或特殊控件 |
Checkbutton | 复选框 | 多项选择 |
Entry | 输入框 | 接受单行文本输入 |
Frame | 框架 | 用于控件分组 |
Label | 标签 | 单行文本显示 |
Lisbox | 列表框 | 显示文本列表 |
Menu | 菜单 | 创建菜单命令 |
Message | 消息框 | 多行文本标签 |
Radiobutton | 单选框 | 从互斥的多选项中做出单个选择 |
Scale | 滑块 | 默认垂直方向,拖动鼠标改变数值形成可视化交互 |
Scorllbar | 滑动条 | 默认垂直,可与Text,Canvas等控件结合使用形成移动空间 |
Text | 文本框 | 接收或输出显示多行文本 |
控件布局管理
Tkinter 控件有特定的几何状态管理方法,管理整个控件区域组织,以下是 Tkinter 公开的布局管理类:包、网格、位置。
方法 | 描述 | 说明 |
pack() | 基于参数进行设置 | after:放于其他组件后面 before:放于其他组件前面 anchor:文本对齐方式(n:上,s:下,w:左,e:右) side:控件在窗口的位置(top,bottom,left,right) fill:填充方式(X:水平,Y: 垂直) expand:1:可扩展,0:不可扩展 |
place() | 位置 | anchor:文本对齐方式 x:组件左上角的x坐标 y:组件右上角的y坐标 relx:组件相对于窗口的x坐标(0-1的小数) rely:组件相对于窗口的y坐标(0-1的小数) width:组件的宽度: height:组件的高度 relwidth:组件相对于窗口的宽度: relheight:组件相对于窗口的高度 |
grid() | 网格 | column:组件所在列的起始位置 columnspam:组件的列宽 row:组件所在行的起始位置 rowspam:组件的行宽 |
综合示例
#coding=utf-8
from tkinter import *
import datetime
window=Tk()
# 初始化窗口
window.title("测试")
# 设置标题
width = 500
height = 300
# 设定窗口大小
screenwidth =window.winfo_screenwidth()
screenheight = window.winfo_screenheight()
alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2)
window.geometry(alignstr)
#获取屏幕尺寸以计算布局参数,使窗口居屏幕中央
window.resizable(False,False)
#设置窗口是否可变长、宽,True:可变,False:不可变
text=StringVar()
# 存储文本变量
label=Label(window,textvariable=text,font=("黑体",12))
label.pack()
# 创建一个标签显示按钮触发后的结果
def get_time():
t = str(datetime.datetime.now()) + '\n'
txt.insert(END, t) # 将t添加到文本显示中
window.after(1000, get_time) # 每隔1s调用函数 gettime 自身获取时间
txt = Text(window)
txt.place(x=150,y=150,width=200,height=200)
get_time()
# 创建一个多行文本显示框显示添加的内容
en1=Entry(window,font=("黑体",12))
en1.place(x=200,y=50,width=100,height=30)
# 创建一个输入框
def getWeather():
"""按钮触发事件"""
print("dangdangdang...")
text.set("dangdangdang...")
btn=Button(window,text='查询',command=getWeather,bg='red')
btn.place(x=200,y=100,width=100,height=30)
# 创建一个按钮
window.mainloop()
# 循环执行