GUI是图形窗口方式显示和操作的用户界面。GUI程序是一种基于事件驱动的程序。GUI程序执行后不会退出,程序在循环等待接收消息 或事件,然后根据事件执行相应的操作。Tkinter是Python的GUI标准模块,主要用来设计GUI 程序。
本章我们大致来讲一下Python中的Tkinter模块来了解Python中的可视化窗口
预备知识
事件驱动程序
事件驱动程序运行是由用户的动作(如鼠标按键,键盘按键等动作)或者是其他程序的消息来决定。
事件驱动程序的基本架构是先设计一个事件循环程序块,事件循环程序不断地检查要处理的事件信息,根据事件触发一个回调函数(也称为钩子函数)进行处理。 其中的事件可能来自键盘或鼠标的动作,也可能来自文件读写,或者是时间事件。
GUI(图形用户界面)类程序就是典型的事件驱动程序,计算机操作系统也是事件驱动程序的典型案例。
Label标签
Label标签一般用于显示文字或图片。
示例如下:
import tkinter as tk
window = tk.Tk()
window.title('示例') #窗口的标题
window.geometry('500x500') #窗口的大小
label = tk.Label(window,text='我是一个标签') #text为显示的文本内容
label.pack() #包管理器
window.mainloop() #事件触发主循环
Button按钮
Button按钮组件用于在 Python 应用程序中添加按钮,按钮上可以放上文本或图像,按钮可用于监听用户行为,能够与一个 Python 函数关联,当按钮被按下时,自动调用该函数。
语法格式如下:
button1 = tkinter.Button ( master, option=value, ... )
master
: 按钮的父容器。
options
: 可选项,即该按钮的可设置的属性。这些选项可以用键 = 值的形式设置,并以逗号分隔。如:
command:按钮关联的函数,当按钮被点击时,执行该函数
text:按钮的文本内容
bg:按钮的背景色
font:文本字体
button1 = tk.Button(root, text='点我', bg='Pink', font=('楷体', 14),command=hit_me)
button1.pack(side=tk.LEFT) #按钮位于容器的左侧
pack组件
组件在窗口中如何布置定位,可以用Pack组件管理器函数。
Pack函数通过设置锚点(anchor),它默认在父窗口中自顶向下添加组件。 它的语法格式如下:
pack(参数)
anchor
:锚点。组件对齐方式,N=上、S=下、W=左、E=右、CENTER=中间
side
:组件停靠在父组件的哪一边。如top、bottom、left、right
fill
:填充方式。side='top'或'bottom'时,填充x方向;side='left'或'right'时,填充y方向;当expand='yes'时,填充父组件剩余空间。
ipadx, ipady
:组件内部元素在x或y方向上填充
padx, pady
:组件外部元素在x或y方向上填充
示例如下:
#导入模块
import tkinter as tk
#创建窗口root
root=tk.Tk()
#在窗口创建按钮button1
button1=tk.Button(root)
#按钮位于窗口左侧
button1.pack(side=tk.LEFT)
单行文本框Entry
功能:让用户输入一行文本字符串。
语法格式如下:
w = Entry( master, option, ... )
master
: 按钮的父容器。
options
: 可选项,即该按钮的可设置的属性。这些选项可以用键 = 值的形式设置,并以逗号分隔。常见属性有:
width:文本框宽度
textvariable:文本框的值,是一个StringVar()对象。
state:文本框状态。默认为 state=NORMAL,可写状态;readonly表只读状态。
from tkinter import *
root = Tk()
e1 = Entry(root, width=10, textvariable=v1, validate='key',validatecommand=(testCMD, '%P'))
e1.grid(row=0, column=0) #grid为网格管理器,e1位于1行1列
get()
单行文本框Entry的方法,可获取文件框的值
示例如下:
v1=Entry.get()
例题练习
第1关:事件驱动程序设计
本关任务:设计一个简单的GUI事件驱动程序,运行程序打开左图窗口,单击“点我"按钮,弹出右图对话框。
代码解析
#导入模块
import tkinter as tk
from tkinter import *
import tkinter.messagebox
#下面的代码写在test函数中,请注意缩进
def test():
#*************Begin*****************#
#创建主窗口,定义窗口标题和大小
root = tk.Tk()
root.title('主窗口')
root.geometry('300x200')
#自定义函数hit_me
def hit_me():
global s #该语句不能删除
#调用普通消息框,赋值给变量s,请补充下面语句中括号内的参数
s=tkinter.messagebox.showinfo(title = "Hi", message = "你好!")
#设置标签文本、位置、间距
textLabel =Label(root, text = '欢迎使用《Python应用程序设计》', justify = LEFT, padx = 10)
textLabel.pack(side = TOP)
#设置按钮1的文本、颜色、事件、位置
button1 = tk.Button(root, text = "点我", bg = "Pink", font = ("楷体", 14),command = hit_me).pack(side = tk.LEFT)
#设置按钮2的文本、颜色、事件、位置
button2 = tk.Button(root, text = "退出", bg = "Pink", font = ("楷体", 14), command = root.quit).pack(side = tk.RIGHT)
#事件触发主循环
root.mainloop()
#*************End*****************#
第2关:简单计算器
本关任务:编写一个只能做加法运算的计算器程序。 运行界面如下:
在文本框中输入数值,单击“计算结果”按钮,在第三个文本框中显示和。
代码解析
from jsq_test import test_num
# 导入标准模块-图形用户接口
from tkinter import *
#创建窗口,设置好窗口标题
root = Tk()
root.title("计算器")
# 创建框架
frame = Frame(root)
frame.pack(padx = 10, pady = 10)
#定义三个StringVar对象,存储加数v1、被加数v2、和v3。
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
#验证参数是否为数字的函数
def test(content):
return content.isdigit()
#用register方法将验证函数包装
testCMD = frame.register(test)
#设置第一个文本框
e1 = Entry(frame, width=10, textvariable=v1, validate='key',
validatecommand=(testCMD, '%P')).grid(row=0, column=0)
#设置“+”标签
Label(frame,text = '+').grid(row = 0, column = 1)
#设置第二个文本框
e2 = Entry(frame,width = 10, textvariable = v2, validate = 'key',validatecommand = (testCMD,'%P')).grid(row = 0, column = 2)
#设置“=”标签
Label(frame,text = '=').grid(row = 0, column = 3)
#设置结果标签
e3 = Entry(frame,width = 10, textvariable = v3,state = 'readonly').grid(row = 0, column = 4)
#计算和的函数
def calc():
result = int(v1.get()) + int(v2.get())
v3.set(str(result))
tag=test_num(result,int(v1.get()),int(v2.get()))
if tag==1: sys.exit()
#设置“计算结果”按钮
Button(frame,text = '计算结果',command = calc).grid(row = 1,column = 2, pady = 5)
#窗口消息主循环
mainloop()