1.说明
能实现Python的图形化界面的库挺多的,比较出名的可能是tkinter、PyQt等,但它们都不够快速,PySimpleGUI就是一个可以让我们快速创建图形界面的库,它整合了 tkinter、Qt、WxPython 和 Remi等库,让我们使用简单代码就能创建出不错的界面
在使用之前,可以先安装一下
pip install pysimplegui
2.主窗口
import PySimpleGUI as sg
# 设置主题
# sg.theme('DarkAmber')
# 界面布局
layout = [
[sg.Text('个人信息')],
[sg.Text('姓名'), sg.InputText()],
[sg.Text('年龄'), sg.InputText(key="input_age")],
[sg.Button('提交'), sg.Button('取消')]
]
# 设置主窗口
window = sg.Window('填写信息', layout)
# 事件循环,监听事件的事件名和对应的值
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
elif event == "提交":
print(event) # 提交
print(values) # {0: 'pan', 'input_age': '18'}
elif event == "取消":
break
# 关闭窗口
window.close()
首先要实例化一个Window对象,表示一个界面窗口,但它的构造方法里有几十个参数,我们只指定前两个,分别是窗口标题和窗口布局,布局是一个列表,列表里是各种窗口控件,有了Window对象之后要使用死循环不断调用read()方法,主要作用是监听各种事件,我们通过事件名判断要执行上面代码,如果是关闭窗口则事件名是None,这时候跳出死循环之后调用Window对象的close()方法释放资源,然后程序正常结束就行
3.布局
Window对象的第二个参数是布局,布局要传入一个列表,列表里可以嵌套列表,每一个列表里的元素都会在同一行显示,换句话说,如果想要不同行,那就把它们放在不同的列表里
layout = [
# 第一行
[sg.Text('个人信息')],
# 第二行
[sg.Text('姓名'), sg.InputText()],
# 第三行
[sg.Text('年龄'), sg.InputText(key="input_age")],
# 第四行
[sg.Button('提交'), sg.Button('取消')]
]
4.文本控件(文本控件)
一个图形界面里有各种控件,比如说文本、输入框、按钮、选择框等,但它们很多属性都是共有的,因为它们都继承与Element对象,此处先以Text为例看一下。Text对象主要用于显示文本,Text对象构造方法的参数很多,但常用的不多
sg.Text(
text='个人信息', # 文本
size=(10, 2), # 字体大小
font=("黑体", 100), # 字体及字号
text_color="#aa99ff", # 字体颜色
background_color="gray", # 背景颜色
enable_events=True, # 允许开启实际,默认是False
auto_size_text=False, # 是否根据文本大小自动调整窗口大小
key="txtInfo", # 指定key
)
5.更新控件
想要更新控件,第一件事就是拿到控件,我们把各种控件通过layout与Window绑定在一起,所以也可以通过中括号的方式取出控件,然后修改控件的属性,但要调用Element对象提供的update()方法才能把修改后的效果更新到界面上。Text是继承Element的,所以它自然也有update()方法
import PySimpleGUI as sg
layout = [
[sg.Text(text='原始信息', key="txtInfo", )],
[sg.Button('修改'), sg.Button('取消')]
]
window = sg.Window('Demo', layout, size=(500, 200))
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
elif event == "修改":
window["txtInfo"].update(
value="修改之后的信息",
text_color="red",
font=("黑体", 20)
)
elif event == "取消":
break
window.close()
6.输入框
输入框也是继承Element对象的,所以key、字体、背景等设置在Text控件那里已经演示了,这里只给Input对象常用的属性
sg.InputText(
default_text="请输入你的名字", # 默认文本
disabled=False, # 是否禁止输入
password_char="*", # 如果设置了密码字符,那输入的文本就会被替换
justification="left", # 文本对齐方式,left, right, center
)
7.文件选择框
文件选择框有好几种,比如说选择单个文件、选择多个文件、选择文件夹、另存为等,但它们只是对象名不同而已,参数用法都是一样的,所以掌握一个就行了
import PySimpleGUI as sg
layout = [
[
sg.FileBrowse(
button_text="请选择单个文件", # 按钮文本
target="single_path", # 把选择后的路径保存到key为input_path的对象
# file_types=(("All Files", "*.*"),), # 默认筛选全部文件类型
file_types=(("All Files", "*.png"),), # 筛选png类型
initial_folder=r"C:\Users\admin\Downloads",
),
sg.InputText(key="single_path"),
],
[
sg.FilesBrowse(
button_text="请选择多个文件",
initial_folder=r"C:\Users\admin\Downloads",
target="multy_path"
),
sg.InputText(key="multy_path")
],
[
sg.FolderBrowse(
button_text="请选择文件夹",
initial_folder=r"C:\Users\admin\Downloads",
target="folder_path"
),
sg.InputText(key="folder_path")
],
[
sg.SaveAs(
button_text="另存为",
initial_folder=r"C:\Users\admin\Downloads",
target="save_as_path"
),
sg.InputText(key="save_as_path")
],
]
window = sg.Window('Demo', layout, size=(500, 200))
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
window.close()
8.设置主题
pysimplegui自带了很多主题,你可以使用预览和查看主题名
import PySimpleGUI as sg
# 预览全部主题
sg.theme_previewer()
# 查看主题名
print(sg.theme_list())
# 设置指定主题
sg.theme("主题名称")
# 设置一个随机主题
sg.theme("")
9.打包程序
如果你已经做好了一个漂亮的程序,那肯定少不了打开成EXE文件,这样就可以在没有安装Python的环境下运行程序了。把Python代码打包为可执行程序的方式很多,比如说pyinstaller、py2exe、nuitka等,但既然是使用PysimpleGUI做的,肯定使用对应的打包工具更方便点,这个库是pysimplegui-exemaker,需要安装一下
pip install pysimplegui-exemaker
安装好之后再终端或者命令行窗口打开它
python -m pysimplegui-exemaker.pysimplegui-exemaker
这样我们就可以使用窗口点击需要打开的程序进行打包了
其实pysimplegui-exemaker本质上也是调用一下PyInstaller,所以你当然也可以直接在命令行执行打包命令
pip install PyInstaller
pyinstaller -wF my_program.py
以上代码都是在主线程执行的,如果主线程遇到耗时任务则UI界面就会卡住或者假死,解决方法就是改为多线程