前言

python构建本地GUI程序有很多方式,比如TkinterwxPython,或是PyQT。但是对于学生而言,并不需要多么华丽的用户界面,只需要“能用”就行了,开发环节越省力越好。

于是我找到了PySimpleGUI这个库。

A introduction to PySimpleGUI

这个库提供了一种近乎傻瓜化的方式,采用List来描述一个GUI界面,同时支持一个简单程序需要的全部特性,并且支持Win/Mac/Linux三大平台,十分适合拿来封装代码。

安装

1
pip install PySimpleGUI

在文件开头加上库引用:

1
import PySimpleGUI as sg

元素

PySimpleGUI有着丰富的控件支持。

  1. 文本框(Text)
1
sg.Text('文本框',size=(12,1),key='output')

'文本框'为框体显示的文字,size为框体的大小,key为框体标识,用于之后对文本框的定位。

  1. 输入框(Input)
1
sg.Input(key='input')
  1. 按钮(Button)
1
sg.Button('Go')

'Go'为按钮的名字。也可以另外设置key值。

  1. 下拉框(Comobo)
1
[ sg.Text("City", size = (20, 1)), sg.Combo(("北京", "上海", "深圳"), size=(10, 1), default_value="上海", key = "-CITY-")]
  1. 弹窗(Popup)
1
2
3
sg.Popup('弹窗1','This is the first one')
sg.Popup('弹窗2','This is the second one')
sg.Popup('弹窗3','This is the third one')

弹出一个窗口包含标题和内容。

  1. 选择文件(FileBrowse)
1
sg.FileBrowse()
  1. 选择文件路径(FolderBrowse)
1
sg.InputText(size=(15,1)),sg.FolderBrowse()
  1. 多行列表文本(ListBox)
1
2
3
4
list = [123]
layout = [
    [sg.Listbox(values=list,size=(20,12),key='LIST',enable_events=True)]
]
  1. 多选框(Checkbox)
1
sg.Checkbox('多选框',default=True)
  1. 单选框(Radio)
1
2
# RADIO1 必有
sg.Radio('单选框','RADIO1',default=True)
  1. 大文本框(Multiline)
1
sg.Multiline(default_text='hello')
  1. 下拉列表框(InputCombo)
1
sg.InputCombo(['box_1','box_2'],size=(20,3))
  1. 拖动按钮(Slider)
1
2
3
4
5
sg.Slider(range=(1,100),orientation='h',size=(34,20),default_value=85)
 # (range=(1, 100):数值范围
 # orientation=拖动方向 ‘h’ :横向 ‘v’:竖向
 # size=(34, 20):大小
 # default_value=85默认值
  1. 下拉选项(InputOptionMenu)
1
sg.InputOptionMenu('Menu_1','Menu_2',size=(20,2))
  1. 菜单(Menu)
1
sg.Menu(menu_def, tearoff=True)
  1. 控件(Column)
1
sg.Column(column1, background_color='')
  1. 进度条(ProgressBar)
1
2
3
sg.ProgressBar(10,orientation='h',size=())
# 10:进度条长度
# orientation=‘h’/v 方向
  1. 调试窗口
1
sg.Print('内容', text_color='', background_color='', font='')
  1. 自带按钮
1
2
3
4
5
sg.OK(), sg.Cancel(),sg.Submit() #这三个按钮是自带的,默认的,不需要单独定义其作用
当然也可以单独设置
sg.Button('Ok'), sg.Button('Cancel')
自带按钮
sg.FolderBrowse()=sg.FileBrowse(), sg.Submit(), sg.Cancel()

构建窗口

使用PySimpleGUI构建一个窗口十分简单,你需要使用一个list描述元素之间的位置关系,然后系统便会自动生成布局。

以我上一篇博文Bilibili直播弹幕收发小程序 | zeroy’s blog中的GUI界面为例:

1
2
3
4
5
6
7
sg.theme('DarkAmber')#选择主题
layout = [
          [sg.Listbox('',size=(75,20),key='-OUT-')],
          [sg.Text('发送弹幕: ', size=(8, 1)),sg.InputText('',key='-input-'),sg.Button("Go"),sg.Button("Exit"),sg.Button("Help")],
          [sg.Text('',key='-error-')]
         ]#使用list描述元素之间的相对关系
window=sg.Window("Bilibili弹幕收发程序",layout)生成窗口

怎么样,是不是很方便呢?

窗口中内建了多种方法,用于描述窗口事件。

1
2
3
window.close()#关闭窗口
window.read()#读取窗口内容
window['key名'].update('需要更新的内容')

掌握了这些基本的知识,构建一个简单的GUI程序应该没什么难的了。

上面提到的收发弹幕的程序的GUI部分完整代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import PySimpleGUI as sg
import send
import receive
sg.theme('DarkAmber')
layout = [
          [sg.Listbox('',size=(75,20),key='-OUT-')],
          [sg.Text('发送弹幕: ', size=(8, 1)),sg.InputText('',key='-input-'),sg.Button("Go"),sg.Button("Exit"),sg.Button("Help")],
          [sg.Text('',key='-error-')]
         ]
window=sg.Window("Bilibili弹幕收发程序",layout)
while True:#开启窗口事件
    event,values=window.read(timeout=3)#为输入框设定超时
    try:
        window['-OUT-'].update(receive.Receive())#更新输出框
    except:
        sg.popup('error: ','请先配置好同一目录下的config.json文件')#异常信息处理
        break
    if event in (None,'Exit'):#按到了退出
        break
    if event=='Go':#发送弹幕
        window['-error-'].update(send.Send(values['-input-']))
        window['-input-'].update("")
    if event=='Help':#帮助页面
        sg.popup('帮助: ','请先配置好同一目录下的config.json文件')
window.close()

更多的例子以及更高阶的应用指路:官方代码库

总结

这个东西过于简洁,适合完全不会写GUI的程序员应急。