
作者:闲欢
来源:Python 技术
像 PySimpleGUI 这类 GUI 界面,跟 Web 页面是不具备可比性的,后者想做得美观简直太容易了。而 GUI 界面本来就是为了生成可执行的软件而生的,在美观上先天性不足。
PySimpleGUI 是 python GUI 框架中的佼佼者,适用于快速生成简洁大方的 GUI。使用它来写 GUI 已经比较快了,那么还有没有更快的方法吗?
答案是肯定的,本文就为你揭晓!
PySimpleGUI 在GitHub上的地址是:
https://github.com/PySimpleGUI/PySimpleGUI
大家可以访问看看,其首页是这样的:
有很多内容是不是?
这里面有一个重要的内容,在 DemoPrograms 文件夹下,这个文件夹是作者写的一些 demo 实例。作者真的是深谙我们这些懒虫的心理,即使有了这么简单好用的 GUI 框架,到了要写实例的时候,我们也可能会去网络上搜索实例,然后采用 CV大法。框架作者可能料想到这一点,所以他自己写了很多不同的实例,让你真正的拿来即用。
这个文件夹下大概有300多个实例,基本上可以囊括我们平时使用 python 写 GUI 所能遇到的各种组件和布局了。
有了这个神器,我们只需要把这个 GitHub 上的项目给复制到本地,然后将这些实例运行一遍,大致知道每个实例u哪些内容。后续当我们自己要写 GUI 时,我们只需要找到对应的实例,然后复制代码就可以了。是不是很简单?
下面我来运行几个 demo ,给大家展示一下这里面的实例都是什么样子的。
我们先复制一下源码:
#!/usr/bin/env python import PySimpleGUI as sg '''
A chatbot with history
Scroll up and down through prior commands using the arrow keys
Special keyboard keys:
Up arrow - scroll up in commands
Down arrow - scroll down in commands
Escape - clear current command
Control C - exit form
''' def ChatBotWithHistory(): # ------- Make a new Window ------- # # give our form a spiffy set of colors sg.theme('GreenTan')
layout = [[sg.Text('Your output will go here', size=(40, 1))],
[sg.Output(size=(127, 30), font=('Helvetica 10'))],
[sg.Text('Command History'),
sg.Text('', size=(20, 3), key='history')],
[sg.ML(size=(85, 5), enter_submits=True, key='query', do_not_clear=False),
sg.Button('SEND', button_color=(sg.YELLOWS[0], sg.BLUES[0]), bind_return_key=True),
sg.Button('EXIT', button_color=(sg.YELLOWS[0], sg.GREENS[0]))]]
window = sg.Window('Chat window with history', layout,
default_element_size=(30, 2),
font=('Helvetica', ' 13'),
default_button_element_size=(8, 2),
return_keyboard_events=True) # ---===--- Loop taking in user input and using it --- # command_history = []
history_offset = 0 while True:
event, value = window.read() if event == 'SEND':
query = value['query'].rstrip() # EXECUTE YOUR COMMAND HERE print('The command you entered was {}'.format(query))
command_history.append(query)
history_offset = len(command_history)-1 # manually clear input because keyboard events blocks clear window['query'].update('')
window['history'].update('n'.join(command_history[-3:])) elif event in (sg.WIN_CLOSED, 'EXIT'): # quit if exit event or X break elif 'Up' in event and len(command_history):
command = command_history[history_offset] # decrement is not zero history_offset -= 1 * (history_offset > 0)
window['query'].update(command) elif 'Down' in event and len(command_history): # increment up to end of list history_offset += 1 * (history_offset < len(command_history)-1)
command = command_history[history_offset]
window['query'].update(command) elif 'Escape' in event:
window['query'].update('')
ChatBotWithHistory()
运行一下,看看效果:
这是一个带历史记录的聊天软件,如果你需要做一个类似的软件的话,可以直接复制代码,然后稍微改动一下。
我们再来看一个例子:
#!/usr/bin/env python """
Example of (almost) all Elements, that you can use in PySimpleGUI.
Shows you the basics including:
Naming convention for keys
Menubar format
Right click menu format
Table format
Running an async event loop
Theming your application (requires a window restart)
Displays the values dictionary entry for each element
And more!
Copyright 2021 PySimpleGUI
""" import PySimpleGUI as sg def make_window(theme): sg.theme(theme)
menu_def = [['&Application', ['E&xit']],
['&Help', ['&About']] ]
right_click_menu_def = [[], ['Nothing','More Nothing','Exit']] # Table Data data = [["John", 10], ["Jen", 5]]
headings = ["Name", "Score"]
input_layout = [[sg.Menu(menu_def, key='-MENU-')],
[sg.Text('Anything that requires user-input is in this tab!')],
[sg.Input(key='-INPUT-')],
[sg.Slider(orientation='h', key='-SKIDER-'),
sg.Image(data=sg.DEFAULT_BASE64_LOADING_GIF, enable_events=True, key='-GIF-IMAGE-'),],
[sg.Checkbox('Checkbox', default=True, k='-CB-')],
[sg.Radio('Radio1', "RadioDemo", default=True, size=(10,1), k='-R1-'), sg.Radio('Radio2', "RadioDemo", default=True, size=(10,1), k='-R2-')],
[sg.Combo(values=('Combo 1', 'Combo 2', 'Combo 3'), default_value='Combo 1', readonly=True, k='-COMBO-'),
sg.OptionMenu(values=('Option 1', 'Option 2', 'Option 3'), k='-OPTION MENU-'),],
[sg.Spin([i for i in range(1,11)], initial_value=10, k='-SPIN-'), sg.Text('Spin')],
[sg.Multiline('Demo of a Multi-Line Text Element!nLine 2nLine 3nLine 4nLine 5nLine 6nLine 7nYou get the point.', size=(45,5), k='-MLINE-')],
[sg.Button('Button'), sg.Button('Popup'), sg.Button(image_data=sg.DEFAULT_BASE64_ICON, key='-LOGO-')]]
asthetic_layout = [[sg.T('Anything that you would use for asthetics is in this tab!')],
[sg.Image(data=sg.DEFAULT_BASE64_ICON, k='-IMAGE-')],
[sg.ProgressBar(1000, orientation='h', size=(20, 20), key='-PROGRESS BAR-'), sg.Button('Test Progress bar')]]
logging_layout = [[sg.Text("Anything printed will display here!")], [sg.Output(size=(60,15), font='Courier 8')]]
graphing_layout = [[sg.Text("Anything you would use to graph will display here!")],
[sg.Graph((200,200), (0,0),(200,200),background_color="black", key='-GRAPH-', enable_events=True)],
[sg.T('Click anywhere on graph to draw a circle')],
[sg.Table(values=data, headings=headings, max_col_width=25,
background_color='black',
auto_size_columns=True,
display_row_numbers=True,
justification='right',
num_rows=2,
alternating_row_color='black',
key='-TABLE-',
row_height=25)]]
specalty_layout = [[sg.Text("Any "special" elements will display here!")],
[sg.Button("Open Folder")],
[sg.Button("Open File")]]
theme_layout = [[sg.Text("See how elements look under different themes by choosing a different theme here!")],
[sg.Listbox(values = sg.theme_list(),
size =(20, 12),
key ='-THEME LISTBOX-',
enable_events = True)],
[sg.Button("Set Theme")]]
layout = [[sg.Text('Demo Of (Almost) All Elements', size=(38, 1), justification='center', font=("Helvetica", 16), relief=sg.RELIEF_RIDGE, k='-TEXT HEADING-', enable_events=True)]]
layout +=[[sg.TabGroup([[ sg.Tab('Input Elements', input_layout),
sg.Tab('Asthetic Elements', asthetic_layout),
sg.Tab('Graphing', graphing_layout),
sg.Tab('Specialty', specalty_layout),
sg.Tab('Theming', theme_layout),
sg.Tab('Output', logging_layout)]], key='-TAB GROUP-')]] return sg.Window('All Elements Demo', layout, right_click_menu=right_click_menu_def) def main(): window = make_window(sg.theme()) # This is an Event Loop while True:
event, values = window.read(timeout=100) # keep an animation running so show things are happening window['-GIF-IMAGE-'].update_animation(sg.DEFAULT_BASE64_LOADING_GIF, time_between_frames=100) if event not in (sg.TIMEOUT_EVENT, sg.WIN_CLOSED):
print('============ Event = ', event, ' ==============')
print('-------- Values Dictionary (key=value) --------') for key in values:
print(key, ' = ',values[key]) if event in (None, 'Exit'):
print("[LOG] Clicked Exit!") break elif event == 'About':
print("[LOG] Clicked About!")
sg.popup('PySimpleGUI Demo All Elements', 'Right click anywhere to see right click menu', 'Visit each of the tabs to see available elements', 'Output of event and values can be see in Output tab', 'The event and values dictionary is printed after every event') elif event == 'Popup':
print("[LOG] Clicked Popup Button!")
sg.popup("You pressed a button!")
print("[LOG] Dismissing Popup!") elif event == 'Test Progress bar':
print("[LOG] Clicked Test Progress Bar!")
progress_bar = window['-PROGRESS BAR-'] for i in range(1000):
print("[LOG] Updating progress bar by 1 step ("+str(i)+")")
progress_bar.UpdateBar(i + 1)
print("[LOG] Progress bar complete!") elif event == "-GRAPH-":
graph = window['-GRAPH-'] # type: sg.Graph graph.draw_circle(values['-GRAPH-'], fill_color='yellow', radius=20)
print("[LOG] Circle drawn at: " + str(values['-GRAPH-'])) elif event == "Open Folder":
print("[LOG] Clicked Open Folder!")
folder_or_file = sg.popup_get_folder('Choose your folder')
sg.popup("You chose: " + str(folder_or_file))
print("[LOG] User chose folder: " + str(folder_or_file)) elif event == "Open File":
print("[LOG] Clicked Open File!")
folder_or_file = sg.popup_get_file('Choose your file')
sg.popup("You chose: " + str(folder_or_file))
print("[LOG] User chose file: " + str(folder_or_file)) elif event == "Set Theme":
print("[LOG] Clicked Set Theme!")
theme_chosen = values['-THEME LISTBOX-'][0]
print("[LOG] User Chose Theme: " + str(theme_chosen))
window.close()
window = make_window(theme_chosen)
window.close()
exit(0) if __name__ == '__main__':
main()
我们来看看运行之后的效果:
这个 demo 是 PySimpleGUI 所有组件的集合,每一个 tab 都是一个分类。这里面包括进度条、画布、主题、滚动条等等。如果你想要找界面组件,到这个 demo 的源码里面找就对了。
这里面还有更多实例,大家就自己去探索吧!这里主要是给大家介绍一个快速开发 GUI 的方法,俗称CV大法。不过这只是一种快速开发方式,大家有时间还是去看看源码,了解一下原理比较好!
大家有什么需要探讨的,可以在评论区留言!
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
CDA 干货分享:统计学的应用 在数据驱动业务发展的时代浪潮中,统计学作为数据分析的核心基石,发挥着无可替代的关键作用。 ...
2025-06-18CDA 精益业务数据分析:解锁企业增长新密码 在数字化浪潮席卷全球的当下,数据已然成为企业最具价值的资产之一。如何精准地 ...
2025-06-18CDA 培训:开启数据分析师职业大门的钥匙 在大数据时代,数据分析师已成为各行业竞相争夺的关键人才。CDA(Certified Data ...
2025-06-18CDA 人才招聘市场分析:机遇与挑战并存 在数字化浪潮席卷各行业的当下,数据分析能力成为企业发展的核心竞争力之一,持有 C ...
2025-06-17CDA金融大数据案例分析:驱动行业变革的实践与启示 在金融行业加速数字化转型的当下,大数据技术已成为金融机构提升 ...
2025-06-17CDA干货:SPSS交叉列联表分析规范与应用指南 一、交叉列联表的基本概念 交叉列联表(Cross-tabulation)是一种用于展示两个或多 ...
2025-06-17TMT行业内审内控咨询顾问 1-2万 上班地址:朝阳门北大街8号富华大厦A座9层 岗位描述 1、为客户提供高质量的 ...
2025-06-16一文读懂 CDA 数据分析师证书考试全攻略 在数据行业蓬勃发展的今天,CDA 数据分析师证书成为众多从业者和求职者提升竞争力的重要 ...
2025-06-16数据分析师:数字时代的商业解码者 在数字经济蓬勃发展的今天,数据已成为企业乃至整个社会最宝贵的资产之一。无论是 ...
2025-06-16解锁数据分析师证书:开启数字化职业新篇 在数字化浪潮汹涌的当下,数据已成为驱动企业前行的关键要素。从市场趋势研判、用 ...
2025-06-16CDA 数据分析师证书含金量几何?一文为你讲清楚 在当今数字化时代,数据成为了企业决策和发展的重要依据。数据分析师这一职业 ...
2025-06-13CDA 数据分析师:数字化时代的关键人才 在当今数字化浪潮席卷全球的时代,数据已然成为驱动企业发展、推动行业变革的核心要素。 ...
2025-06-13CDA 数据分析师报考条件全解析 在大数据和人工智能时代,数据分析师成为了众多行业追捧的热门职业。CDA(Certified Data Analyst ...
2025-06-13“纲举目张,执本末从。”若想在数据分析领域有所收获,一套合适的学习教材至关重要。一套优质且契合需求的学习教材无疑是那关键 ...
2025-06-092025 年,数据如同数字时代的 DNA,编码着人类社会的未来图景,驱动着商业时代的运转。从全球互联网用户每天产生的2.5亿TB数据, ...
2025-05-27CDA数据分析师证书考试体系(更新于2025年05月22日)
2025-05-26解码数据基因:从数字敏感度到逻辑思维 每当看到超市货架上商品的排列变化,你是否会联想到背后的销售数据波动?三年前在零售行 ...
2025-05-23在本文中,我们将探讨 AI 为何能够加速数据分析、如何在每个步骤中实现数据分析自动化以及使用哪些工具。 数据分析中的AI是什么 ...
2025-05-20当数据遇见人生:我的第一个分析项目 记得三年前接手第一个数据分析项目时,我面对Excel里密密麻麻的销售数据手足无措。那些跳动 ...
2025-05-20在数字化运营的时代,企业每天都在产生海量数据:用户点击行为、商品销售记录、广告投放反馈…… 这些数据就像散落的拼图,而相 ...
2025-05-19