最近发现一种 Python 的 GUI 库 PySimpleGUI
,写一个简单的有界面的小工具很简单呢!
这里我们来写一个计算肥胖指数(BMI)的小工具。首先,通过百度得到 BMI 指数的计算公式为:
体重 / (身高的平方)
体重单位为 kg, 身高的单位为 m
再查阅中国的 BMI 标准为:
分类 | BMI |
---|---|
偏瘦 | <= 18.4 |
正常 | 18.5 ~ 23.9 |
过重 | 24.0 ~ 27.9 |
肥胖 | >= 28.0 |
于是先写一个函数,用来计算 BMI。
def calc_bmi(h, w):
try:
h, w = float(h), float(w)
bmi = round(w / h ** 2, 1)
if bmi < 18.5:
standard = '过轻'
elif 18.5 <= bmi <= 23.9:
standard = '正常'
elif 24.0 <= bmi <= 27.9:
standard = '过重'
else:
standard = '肥胖'
except (ValueError, ZeroDivisionError):
return None
else:
return f'BMI: {bmi}, {standard}'
先算一下我自己的:
print(calc_bmi(1.70, 77))
# BMI: 26.6, 过重
😂,好吧,胖了!
接下来,我们就要写一个带界面的了。
首先呢,我们需要下载 PySimpleGUI
pip install PySimpleGUI
下好后,先不忙写代码,我们先画一下界面草图(一定要先画草图!):
好了,草图画好了,可以开始写代码了。
首先肯定要引入 PySimpleGUI:
import PySimpleGUI as sg
然后开始使用 PySimpleGUI 构造界面,在 PySimpleGUI 中将界面布局看作一个二维的表格。
根据上图,我们可以将 UI 划分为 5 行。
第一行,有一个 文本显示 '身高', 还有一个文本输入框;
第二行,有一个 文本显示 '体重', 还有一个文本输入框;
第三行,只有一个按钮;
第四行,一个文本显示 BMI 函数的运算结果;
第五行,一个按钮,用于退出程序。
在 PySimpleGUI 中要实现布局很简单,先构造一个二维的列表:
layout = [[sg.Text('身高'), sg.InputText(size=(15,))],
[sg.Text('体重'), sg.InputText(size=(15,))],
[sg.Button('计算 BMI', key='submit')],
[sg.Text('', key='bmi', size=(20,2))],
[sg.Quit('退出', key='q')]]
能看出点什么么?二维列表中的每个元素代表一行,子列表代表一行中的多个控件。
接下来,把构造的布局加入窗口中:
window = sg.Window('BMI计算器', layout, font='微软雅黑')
此时运行,一下,就可以看到界面啦!
接下来,我们再添加事件处理。
event, value = window.Read()
window.Read() 方法,用于读取页面上的事件和输入的数据。其返回值为('事件', {0: '输入控件1接收的值', 1: '输入控件2接受的值'})
。
当我们点击计算 BMI
按钮的时候,会接收到 submit 事件,这是在[sg.Button('计算 BMI', key='submit')]
定义的。
那么接下来,当我们点击 submit ,也就是计算 BMI
按钮,就调用计算 BMI 的函数,然后把函数的结果展示在界面的文本中。
# 当事件为 submit 执行下面的代码
if event == 'submit':
# 通过 window.Read() 拿到的界面输入的值,身高在第一个输入框,体重在第二个输入框
bmi = calc_bmi(value[0], value[1])
# 如果函数计算后得到的有效 bmi 的值(也就是没有报错)
if bmi:
# 把 bmi 文本显示的内容,改为从 calc_bmi 中返回的计算结果
window.Element('bmi').Update(bmi, text_color='black')
else:
# 如果 calc_bmi 中报错,就是输入有异常,在 bmi 文本红色字体显示错误信息
window.Element('bmi').Update('输入有误!', text_color='red')
好了,运行一下。
虽然能完成计算,但是当你点了按钮就结束了。因为界面只会执行一次。为了一直保持界面不关闭,就需要用 while 循环一直循环显示界面,当点击退出按钮时再退出循环,结束界面展示。
那么,完整代码如下:
import PySimpleGUI as sg
def calc_bmi(h, w):
try:
h, w = float(h), float(w)
bmi = round(w / h ** 2, 1)
if bmi < 18.5:
standard = '过轻'
elif 18.5 <= bmi <= 23.9:
standard = '正常'
elif 24.0 <= bmi <= 27.9:
standard = '过重'
else:
standard = '肥胖'
except (ValueError, ZeroDivisionError):
return None
else:
return f'BMI: {bmi}, {standard}'
layout = [[sg.Text('身高'), sg.InputText(size=(15,))],
[sg.Text('体重'), sg.InputText(size=(15,))],
[sg.Button('计算 BMI', key='submit')],
[sg.Text('', key='bmi', size=(20,2))],
[sg.Quit('退出', key='q')]]
window = sg.Window('BMI计算', layout, font='微软雅黑')
while True:
event, value = window.Read()
if event == 'submit':
bmi = calc_bmi(value[0], value[1])
if bmi:
window.Element('bmi').Update(bmi, text_color='black')
else:
window.Element('bmi').Update('输入有误!', text_color='red')
elif event == 'q':
break
window.Close()
那么,看看你是胖还是瘦吧!