前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[1212]Python GUI之PySimpleGUI

[1212]Python GUI之PySimpleGUI

作者头像
周小董
发布2023-10-10 08:39:05
3040
发布2023-10-10 08:39:05
举报
文章被收录于专栏:python前行者python前行者
image.png
image.png

简介

PySimpleGUI基于Tkinter,Remi、wxPython和PyQt。Remi将应用程序的界面转换为HTML以在Web浏览器中呈现”。 PySimpleGUI不需要使用类来创建用户界面。 使用PySimpleGUI创建GUI贼简单。

  • 官方文档:https://pysimplegui.readthedocs.io/en/latest/
  • GitHub:https://github.com/PySimpleGUI/PySimpleGUI
  • Gitee克隆:https://gitee.com/yumos/PySimpleGUI

安装PySimpleGui

代码语言:javascript
复制
# 使用pip命令安装即可(默认安装到全局)
pip install PySimpleGUI

PySimpleGUI制作简易弹窗界面

  • 两种界面设计模式

(1) 单次显示界面(one-shot window)

类似于弹窗,出现一次 常用于提示信息,收集信息

(2)持续显示界面(Persistent window)

持续不断显示,除非用户手动关闭 常作为软件的主界面

  • 制作弹窗

官网默认的库的缩写为sg,使用时建议保持统一,也是使用sg

image.png
image.png

弹窗类型:(第一种和第二种是一致的)

代码语言:javascript
复制
sg.popup('注意!')

sg.popup_ok('默认弹窗')

sg.popup_yes_no('带Yes和No按钮的弹窗')

sg.popup_cancel('带cancel按钮的弹窗')

sg.popup_ok_cancel('带OK和cancel按钮的弹窗')

sg.popup_error('带红色error按钮的弹窗')

sg.popup_auto_close('几秒后自动关闭的弹窗')

最后一个执行后程序会在2s左右自动退出,除了以上的简单的默认函数外,还可以手动设置参数;

简单使用

基本的配置也就搞定啦,下一步我们就按官网的例子写一个小程序练练手

代码语言:javascript
复制
import PySimpleGUI as sg  

layout = [
	[sg.Text('My one-shot window.')],      
	[sg.InputText()],      
	[sg.Submit(), sg.Cancel()]
] 

window = sg.Window('Window Title', layout)  

event, values = window.read()   

text_input = values[0]    
sg.popup('You entered', text_input)
image.png
image.png
image.png
image.png

对比一下各个文字就大概看出来了每一句是什么意思,接下来我们简单分析一下PySimpleGUI。

代码语言:javascript
复制
# 设置布局,一个数组是一行
layout = [
	[sg.Text('My one-shot window.')],      
	[sg.InputText()],      
	[sg.Submit(), sg.Cancel()]
] 

可以想想成一个表格,在某行某列,当然每行的大小可以通过各个元素的属性(size)设置。之后的文章讲。

image.png
image.png
代码语言:javascript
复制
# 然后将layout装进Window中
window = sg.Window('Window Title', layout)  

# 然后执行window.read() 就可以看到窗口了
event, values = window.read()   

PySimpleGUI基本逻辑就是这样,这里的event、就是指某个元素的key,values就是所有的value,也就是值。

我们在后边加一句print()看看

代码语言:javascript
复制
print(values)

结果

代码语言:javascript
复制
{0:'hello'}

因为我们没有个元素指定key ,所以是默认使用数字代替。在PySimpleGUI中,可以把所有你能看到的,可以定义的元素理解为:区别他们的方式就是key,然后他们的值就是value。

演示一下加key的样子

代码语言:javascript
复制
layout = [
	[sg.Text('My one-shot window.')],      
	[sg.InputText(key='userInput')],    # 这句增加key='userInput'  
	[sg.Submit(), sg.Cancel()]
] 

text_input = values['userInput']    # 这里也要改,就是对象取值

我们再次执行: 结果

代码语言:javascript
复制
{'userInput':'hello'}

这样就很明确了,剩下的等我后边按组件慢慢讲。

代码语言:javascript
复制
#这两句后边慢慢讲,也就是读取输入内容,弹窗显示
text_input = values[0]    
sg.popup('You entered', text_input)

常用属性介绍

这里介绍几个我们常用的一些属性吧。比如 尺寸 ,元素显示名称 , 绑定事件 、 元素键值

  • 尺寸
代码语言:javascript
复制
#  关键字 size,或者 s
# 例如设置窗口的大小为 宽:500px,高:300px,有的元素是以字符宽高表示
# sg.Window() 添加 size=(500,300)
window = sg.Window(size=(500,300))
image.png
image.png
  • 元素(显示)名称
代码语言:javascript
复制
# 简单的写法就是直接在元素函数中写一个字符串就可以
# 如上我们设置 窗口 的名称为 size
window = sg.Window('size')
image.png
image.png
  • 元素键值
代码语言:javascript
复制
# 在PySimpleGUI中我们若为元素指定 key 则必须唯一
# 假如我们有三个 InputText其中一个指定key
layout = [
    [sg.InputText(key='first')],
    [sg.InputText()],
    [sg.InputText()],
    [sg.Submit()]
]
image.png
image.png

执行结果

image.png
image.png

常用控件

一般简单程序所用的控件有Text、Input、Button、Radio、Checkbox、Combo、Image、Window、FileBrowse、Graph、弹出对话框 等。

Text使用
代码语言:javascript
复制
import PySimpleGUI as sg

sg.theme('LightGreen')
# 窗体界面布局
# 此处Text、T都表示显示标签
layout = [
        [sg.Text('Text演示', size=(30, 1), justification='center')],
        [sg.Text('Text1', size=(30, 1),key='-Text1-',font=16,
         background_color='green',text_color='white')],
        [sg.T('Text2', size=(30, 1),key='-Text2-')],

    ]

# 窗体显示
window = sg.Window('PySimpleGUI Elements 测试', layout)
str = "演示"

# 消息循环
while True:
    event, values = window.read(timeout=20)
    # print(event,values)
    if event == 'Exit' or event == sg.WIN_CLOSED:
        break

    window['-Text2-'].update(str)

window.close()

注意font、background_color、text_color等属性的设置

image.png
image.png
Input使用
代码语言:javascript
复制
import PySimpleGUI as sg

sg.theme('LightGreen')
# 窗体界面布局
# 此处InputText、Input、I都表示输入文本框
layout = [
        [sg.Text('输入框演示', size=(40, 1), justification='center')],
        [sg.Text('输入框1', size=(10, 1)),sg.InputText(size=(30,1),key='-INPUT1-')],
        [sg.Text('输入框2', size=(10, 1)),sg.Input(size=(30,1),key='-INPUT2-')],
        [sg.Text('输入框3', size=(10, 1)),sg.I(size=(30,1),key='-INPUT3-')],
        [sg.Text('输入数据:', size=(10, 1)),sg.I(size=(30,1),key='-DISPLAY-')],
    ]

# 窗体显示
window = sg.Window('PySimpleGUI Elements 测试', layout)
str = ""

# 消息循环
while True:
    event, values = window.read(timeout=20)
    # print(event,values)
    if event == 'Exit' or event == sg.WIN_CLOSED:
        break

    str = values['-INPUT1-'] + values['-INPUT2-'] + values['-INPUT3-']
    window['-DISPLAY-'].update(str)

window.close()
image.png
image.png
Button及弹出对话框使用
代码语言:javascript
复制
import PySimpleGUI as sg

sg.theme('LightGreen')
# 窗体界面布局
# 此处'Button、B都表示按钮
layout = [
        [sg.Text('Button及弹出对话框演示', size=(40, 1), justification='center')],
        [sg.Button('OK_Cancel对话框', size=(15, 1),key='-Button1-',enable_events=True)],
        [sg.B('获取输入文本', 
         size=(10, 1),key='-Button2-',enable_events=True,button_color='red')],
        [sg.Exit()],
    ]

# 窗体显示
window = sg.Window('PySimpleGUI Elements 测试', layout)
str = ""

# 消息循环
while True:
    event, values = window.read()
    # print(event,values)
    if event == 'Exit' or event == sg.WIN_CLOSED:
        break
    elif event == '-Button1-':
        sg.popup_ok_cancel('Button1 测试',)
    elif event == '-Button2-':
        text = sg.popup_get_text(title="输入对话框测试",message='请输入姓名',default_text="测试")
        sg.popup('结果', '输入数据为:', text)

window.close()
image.png
image.png
Radio、Checkbox、Combo使用
代码语言:javascript
复制
import PySimpleGUI as sg

sg.theme('LightGreen')
# 窗体界面布局
layout = [
        [sg.Text('Radio、Checkbox、Combo演示', size=(40, 1), justification='center')],
        [sg.Radio('Radio1','Radio', key='-Radio1-'),
         sg.Radio('Radio2', 'Radio',key='-Radio2-')],
        [sg.Checkbox('CheckBox1',key='-CHECKBOX1-'),
         sg.Checkbox('CheckBox2',key='-CHECKBOX2-',disabled=True,checkbox_color='red')],
        [sg.Combo(['3','5','7'],'3',key='-Combo1-',background_color='white',
         size=(15,1),enable_events=True)],
        [sg.Text('操作结果:',k='-TEXT1-')],
        [sg.Exit()],
    ]

# 窗体显示
window = sg.Window('PySimpleGUI Elements 测试', layout)

# 消息循环
while True:
    event, values = window.read(timeout=100)
    # print(event,values)
    if event == 'Exit' or event == sg.WIN_CLOSED:
        break

    str = ""

    if values['-Radio1-']:
        str = 'Radio1选中'
    elif values['-Radio2-']:
        str = str + 'Radio2选中'

    if values['-CHECKBOX1-']:
        str = str + 'CheckBox1选中' 

    if event == '-Combo1-':
        str = str + values['-Combo1-']
    window['-TEXT1-'].update(str)

window.close()
image.png
image.png
Image、FileBrowse使用
代码语言:javascript
复制
比较糟心的是,这个image组件只能显示png和gif图。
image filename if there is a button image. GIFs and PNGs only.
import PySimpleGUI as sg

sg.theme('LightGreen')
# 窗体界面布局
layout = [
        [sg.Text('Image、FileBrowse演示', size=(40, 1), justification='center')],
        [sg.Text('操作结果:',k='-TEXT1-'),
         sg.FileBrowse("浏览",target='-GETFILE-',key='-GETFILE-',
         enable_events=True,font=16,size=(10,2))],
        [sg.Image(key="-IMAGE-",size=(300,200),filename=r'C:\PySimpleGUI\lena.png')],
        [sg.Exit()],
    ]

# 窗体显示
window = sg.Window('PySimpleGUI Elements 测试', layout)

# 消息循环
while True:
    event, values = window.read()
    # print(event,values)
    if event == 'Exit' or event == sg.WIN_CLOSED:
        break

    if event == '-GETFILE-':
        name = values['-GETFILE-']
        window['-TEXT1-'].update(name)
        window['-IMAGE-'].update(filename=name)
        window['-IMAGE-'].set_size(window['-IMAGE-'].get_size())

window.close()
image.png
image.png
image.png
image.png

上面代码的问题是Image组件只能接收png和gif图,图片的格式千千万,就连最常见的jpg都不能显示,就有点水了吧。

没办法,查阅image的update方法,发现data Base64 encoded string OR a tk.PhotoImage object,也就是支持tk.PhotoImage图形格式。所以采用PIL库转换一下吧。

代码语言:javascript
复制
# 导入包
from PIL import Image,ImageTk
        # 这一句改为以下三句
        # window['-IMAGE-'].update(filename=name)
        image = Image.open(name)
        photo_img = ImageTk.PhotoImage(image)

        window['-IMAGE-'].update(data=photo_img)

参考:https://blog.csdn.net/qq_38830593/article/details/117638327 https://zhuanlan.zhihu.com/p/514540346 https://blog.csdn.net/Rocky006/article/details/129820651

pyside6 - 简单了解:https://blog.csdn.net/qq_38830593/article/details/122801722

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 简单使用
  • 常用属性介绍
  • 常用控件
    • Text使用
      • Input使用
        • Button及弹出对话框使用
          • Radio、Checkbox、Combo使用
            • Image、FileBrowse使用
            相关产品与服务
            腾讯云服务器利旧
            云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档