图形化界面设计(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()
# 循环执行