Python PySimpleGUI复杂客户端系统开发(多窗口等)
目录
0.需求
C/S客户端系统开发、快速开发、短暂开发、成本低、界面不要求酷炫!!!那么可以考虑PySimpleGUI
注意:PySimpleGUI 5 需要注册密钥,商业需要花钱,因此采用4.60.5版本,免费!!!
1. Qt(c++)、winform和.net(c#)、Java、Go、这些编程、库的GUI学习成本高,若想快速开发和短暂开发,不推荐这个(不过也和个人熟悉程度有关,优先使用自己熟悉的语言编程-个人搞深度学习-优先Python);
2. 采用Python进行客户端GUI界面开发,有好几个库可用
Gooey 2021年就不更新了,基于Wxpython,像argparse解析参数一样,但是不能可视化图片,可以读取路径! 极其简单操作可以,但不推荐。
dearpygui 一直更新,底层是c++,这是python接口,打开文件选择的窗口是独有的,不方便,尽管功能复杂强大,但是不如学pyqt6、pyside6,不推荐。
Tkinter是python内置库,但是也需要学习很多内容,不利于快速,界面不酷炫-导致基于此库开发的PySimpleGUI界面也不酷炫,实用为主吧,要想酷炫且python下推荐pyqt和pyside6(可自定义酷炫样式、底层是c++性能更高)。
PySimpleGUI最符合条件:①PySimpleGUI(主要库,基于Python自带的GUI图形设计库Tkinter);②PySimpleGUIWX(基于GUI图形设计库WxPython);③PySimpleGUIQT(基于GUI图形设计库PySide2);④PySimpleGUIWEB(基于GUI网页端图形设计库Remi)
pyqt5、6 GPL协议,若商业化需要购买(尽管很多人不关心),Qt的python接口(文档多、用户多)
pyside6 官方QT6的python接口,文档不如pyqt6多一些,但功能基本相同,若进行更复杂、更灵活、更好看界面时,且用python时,可推荐。
总之,根据第一句话,判断我需要pysimplegui开发GUI。
1.前提
学习资料: PySimpleGUI-github、PySimpleGUI官网、B站上也有个UP主(非本人)有个系列视频教程(方便入门,可快进查看、可打好基础,对于复杂操作,这个视频未写,但是也很好了,本质都是看官网文档,挨个查英文API文档,再挨个试试)
PySimpleGUI默认是基于python内置库tkinker的高级库,旨在简化、快速开发客户端界面!
经验:1个窗口界面写1个函数,每个窗口函数包含:布局layout、窗口事件event(持久化窗口有while True代码,里面写各种操作)
2.入门代码
# 摘自-官方github 每个窗口都要有如下5个步骤
import PySimpleGUI as sg # Part 1 - The import
# Define the window's contents
layout = [ [sg.Text("What's your name?")], # Part 2 - The Layout
[sg.Input()],
[sg.Button('Ok')] ]
# Create the window
window = sg.Window('Window Title', layout) # Part 3 - Window Defintion
# Display and interact with the Window
event, values = window.read() # Part 4 - Event loop or Window.read call
# Do something with the information gathered
print('Hello', values[0], "! Thanks for trying PySimpleGUI")
# Finish up by removing from the screen
window.close() # Part 5 - Close the Window
3.实际代码
对于很多函数不懂的,可以查看人家的视频or官方文档!如下是一些关键组件、操作等
sg.Window、Button、Input、Text、Frame、Column、Table、Stretch(用于布局中组件横向对齐)、以及window.bind绑定事件
①组件内容等参数更新:一般采用window[key].update(),查看源码知道window[key].update()等同于window.FindElement(key).update(),推荐前者。
②若想组件跟随窗口自适应变化,那么sg.Frame和sg.Column组件更好,其他组件需要监控窗口尺寸变化,再update组件尺寸。可以在column和frame中包含其他组件!
③event, values = window.read(),其中event为组件中的事件名称(如有key参数则为key),values为组件中的数值内容(只是组件级,像menu中按钮对应内容无法获取到)
import PySimpleGUI as sg
def create_bar_window(main_window):
layout = [
[sg.In(key="-barIN-")],
[sg.Button("更改", key="-barUpdate-")],
]
bar_window = sg.Window("更新主窗口内容", layout, finalize=True)
# main_window.hide()
while True:
bar_event, bar_values = bar_window.read()
if bar_event == sg.WIN_CLOSED:
bar_window.close()
break
if bar_event == "-barUpdate-":
print(bar_event, bar_values)
main_window["-main_text-"].Update(value=bar_values["-barIN-"])
# main_window.un_hide()
bar_window.close()
def create_main_window():
menu_def = [
["文件", ["打开::open", "导出::save", "关闭图像::close"]],
["要素", ["一键生成::one",]],
]
layout = [
[sg.Menu(menu_def)],
[sg.Text("I'm leilei", key="-main_text-")],
]
window = sg.Window("操作", layout, size=(400,300), resizable=True, finalize=True)
# window.maximize()
while True:
event, values = window.read()
print(event, 111)
if event == sg.WIN_CLOSED:
# print(sg.WIN_CLOSED, 555)
break
if event == "打开::open":
img_filename = sg.popup_get_file('选择输入图片', no_window=True, file_types=(("图片类型", "*.png;*.jpg"),))
print(img_filename)
elif event == "导出::save":
save_img_filename = sg.popup_get_file("选择保存图片", no_window=True, save_as=True, file_types=(("图片类型", "*.png;*.jpg"),))
print(save_img_filename)
is_ok = sg.popup_ok_cancel()
print(is_ok)
elif event == "关闭图像::close":
print(window["关闭图像::close"])
if event == "一键生成::one":
create_bar_window(window)
window.close()
if __name__=="__main__":
create_main_window()
4.界面
另外的实现的一个小例子: