如何只用一行Python代码制作一个GUI(图形界面)?
共 4093字,需浏览 9分钟
· 2022-05-23
GUI(图形用户界面),顾名思义就是用图形的方式,来显示计算机操作的界面,更加方便且直观。
一个好看又好用的GUI,可以大大提高大家的使用体验,提高效率。
比如你想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没有用户体验的。
所以开发一个图形化的小窗口,就变得很有必要。
今天,小F就给大家介绍如何只用一行Python代码制作一个GUI。
主要使用Python的PySimpleGUI库来完成这个工作。
# 安装PySimpleGUI
pip install PySimpleGUI -i https://mirror.baidu.com/pypi/simple
详细的接口文档地址如下。
https://pysimplegui.readthedocs.io/en/latest/call%20reference/
▍1、选择文件夹
首先导入PySimpleGUI库,并且用缩写sg来表示。
import PySimpleGUI as sg
# 窗口显示文本框和浏览按钮, 以便选择一个文件夹
dir_path = sg.popup_get_folder("Select Folder")
if not dir_path:
sg.popup("Cancel", "No folder selected")
raise SystemExit("Cancelling: no folder selected")
else:
sg.popup("The folder you chose was", dir_path)
通过使用PySimpleGUI的popup_get_folder()方法,一行代码就能实现选择文件夹的操作。
示例如下。
![](https://filescdn.proginn.com/da8ab8aa993699f827ccc2d032792bb3/e568de86e483329eeed5212d4127b3ba.webp)
点击Browse按钮,选择文件夹,文本框就会显示出文件夹的绝对路径。
点击OK按钮,显示最终选择的路径信息,再次点击OK按钮,结束窗口。
![](https://filescdn.proginn.com/066f8be4a71d9bd3e7a0198d21d3af63/a0599403b695f103a722a764020910f8.webp)
如果没有选择文件夹,而是直接点击OK按钮,会直接提示没有选取文件夹。
▍2、选择文件
选择文件操作和上面选择文件夹的有点相似。
不同的是,选择文件可以设置multiple_files(是否为多个文件)和file_types(文件类型)参数。
# 窗口显示文本框和浏览按钮, 以便选择文件
fname = sg.popup_get_file("Choose Excel file", multiple_files=True, file_types=(("Excel Files", "*.xls*"),),)
if not fname:
sg.popup("Cancel", "No filename supplied")
raise SystemExit("Cancelling: no filename supplied")
else:
sg.popup("The filename you chose was", fname)
示例如下。
![](https://filescdn.proginn.com/bd845e74c756b4c51067689fca601fc8/da9684ee3496f3a0a4b77ed8072ab3c5.webp)
选择了多个Excel文件,最终结果返回了所有文件的路径地址。
▍3、选择日期
使用popup_get_date()方法,显示一个日历窗口。
# 显示一个日历窗口, 通过用户的选择, 返回一个元组(月, 日, 年)
date = sg.popup_get_date()
if not date:
sg.popup("Cancel", "No date picked")
raise SystemExit("Cancelling: no date picked")
else:
sg.popup("The date you chose was", date)
示例如下。
![](https://filescdn.proginn.com/477ee61f33cd06f8f50e0e5b7e8aa75d/fcfd18775f640a140a89c81498c5442d.webp)
选择好日期后,点击OK按钮,即可返回日期元组结果。
▍4、输入文本
使用popup_get_text()方法,显示一个文本输入框。
# 显示文本输入框, 输入文本信息, 返回输入的文本, 如果取消则返回None
text = sg.popup_get_text("Please enter a text:")
if not text:
sg.popup("Cancel", "No text was entered")
raise SystemExit("Cancelling: no text entered")
else:
sg.popup("You have entered", text)
键入信息,示例如下。
![](https://filescdn.proginn.com/548a1590add4d1c24e288b7e2423b6d7/6782e2af4e1e41c7108b474cd5cdd08c.webp)
点击OK按钮,返回输入的文本信息。
如果没有输入,直接点击OK按钮,会提示没有文本输入。
▍5、弹窗无按钮
# 显示一个弹窗, 但没有任何按钮
sg.popup_no_buttons("You cannot click any buttons")
结果如下。
![](https://filescdn.proginn.com/3bea4a14e9691484b54f94fd4d7ddf79/b2296e2c65669348e2f1f7b16f7c4f10.webp)
▍6、弹窗无标题
# 显示一个没有标题栏的弹窗
sg.popup_no_titlebar("A very simple popup")
结果如下。
![](https://filescdn.proginn.com/4f842dd68c7d3f6ecdbb0ff430fb0a01/213f7caa3cfb47e1c58e2a8ebd4157d5.webp)
▍7、弹窗只有OK按钮
# 显示弹窗且只有OK按钮
sg.popup_ok("You can only click on 'OK'")
结果如下。
![](https://filescdn.proginn.com/808d67c609b88bd378c98253b6244c56/b50e57f0c17c9caa0ef7e4aba9ca512c.webp)
▍8、弹窗只有Error按钮(红色)
# 显示弹窗且只有error按钮, 按钮带颜色
sg.popup_error("Something went wrong")
结果如下。
![](https://filescdn.proginn.com/0910748f03a20f3beb697aa3d5172a77/f9bd687d1ead37b9de4b16b1d4fb56ad.webp)
▍9、显示通知窗口
# 显示一个“通知窗口”, 通常在屏幕的右下角, 窗口会慢慢淡入淡出
sg.popup_notify("Task done!")
结果如下, Task done提示信息淡入淡出。
![](https://filescdn.proginn.com/23f4fdd4d43177da9b19f06a44a43958/67395fca8d2f791dded6ba37725970d0.webp)
▍10、弹窗选择
# 显示弹窗以及是和否按钮, 选择判断
answer = sg.popup_yes_no("Do you like this video?")
sg.popup("You have selected", answer)
结果如下。
![](https://filescdn.proginn.com/4f8e872ffdc1ec303a59bf65a8d240e5/5f6b5a345df3171a2ff0c5069303ff91.webp)
▍11、自定义弹窗
上面那些弹窗都是库自带的,如果想自定义创建,可以参考下面的方法。
# 自定义创建弹窗, 一行代码完成
choice, _ = sg.Window(
"Continue?",
[[sg.T("Do you want to subscribe to this channel?")], [sg.Yes(s=10), sg.No(s=10), sg.Button('Maybe', s=10)]],
disable_close=True,
).read(close=True)
sg.popup("Your choice was", choice)
结果如下。
![](https://filescdn.proginn.com/deeb70e4d9e92b06ab69ccc6b55d2fa8/b0fa20226f5be500cb28d8f863601469.webp)
▍12、实战
最后来个综合实战案例,将某个文件夹下所有的Excel文件中的sheet表,一一保存为单独的Excel文件。
代码如下,需要安装xlwings库,其中pathlib库是内置的。
from pathlib import Path
import PySimpleGUI as sg
import xlwings as xw
# 选择输入文件夹
INPUT_DIR = sg.popup_get_folder("Select an input folder")
if not INPUT_DIR:
sg.popup("Cancel", "No folder selected")
raise SystemExit("Cancelling: no folder selected")
else:
INPUT_DIR = Path(INPUT_DIR)
# 选择输出文件夹
OUTPUT_DIR = sg.popup_get_folder("Select an output folder")
if not OUTPUT_DIR:
sg.popup("Cancel", "No folder selected")
raise SystemExit("Cancelling: no folder selected")
else:
OUTPUT_DIR = Path(OUTPUT_DIR)
# 获取输入文件夹中所有xls格式文件的路径列表
files = list(INPUT_DIR.rglob("*.xls*"))
with xw.App(visible=False) as app:
for index, file in enumerate(files):
# 显示进度
sg.one_line_progress_meter("Current Progress", index + 1, len(files))
wb = app.books.open(file)
# 提取sheet表为单独的Excel表格
for sheet in wb.sheets:
wb_new = app.books.add()
sheet.copy(after=wb_new.sheets[0])
wb_new.sheets[0].delete()
wb_new.save(OUTPUT_DIR / f"{file.stem}_{sheet.name}.xlsx")
wb_new.close()
sg.popup_ok("Task done!")
首先选择输入文件夹和输出文件夹的地址。
然后通过pathlib库对输入文件夹进行遍历,查找出所有xls格式文件的路径地址。
点击OK按钮后,就会开始表格转换,操作如下。
![](https://filescdn.proginn.com/a263d355f0ec144e8273a3ec151c2a19/4660443de65dd5aa53bf80c8156d0dcd.webp)
使用了one_line_progress_meter()方法显示程序处理的进度。
![](https://filescdn.proginn.com/5831e1db5edb766fb77f796a6f8d5512/d465c61e680254d1c6bc86c9c65dbe56.webp)
20表示有20次循环,原始Excel文件总计有20个,需要处理20次,其他的都在上图中标示出来咯。
好了,今天的分享就到这里了,有兴趣的小伙伴可以自行去学习。
对比Excel系列图书累积销量达15w册,让你轻松掌握数据分析技能,可以在全网搜索书名进行了解选购: