目录
从我接触的图形界面开发的库和插件大概有tkinter,pyqt,WxPython 但最近了解到了一种新类型的图像界面设计PySimpleGUI,那这个新的类有什么比较好的优势,嗯?这样来说吧PySimpleGUI封装了tkinter,这样就可以获得所有相同的部件元素,但是是以简单,高效的方式设计界面。
学习一样,会四样。PySimpleGUI体系封装了tkinter、Qt、WxPython和Remi,这样就可以获得所有相同的部件元素,例如常见的按钮,弹窗,滑块,下拉菜单等。但是布局设计(交互方式)使用的是更简单,更人性化的方法。帮助我们创建和管理GUI部件元素,提供一个简单、高效的界面。
以上的内容都是官方语言,其实看个人喜好。但最近确实想尝试一下这个PySimpleGUI新方法,这理解就是说python有一个简单的GUI。那接下来咱们就开始走这条不归路了吧。
开发所需:Python版本 3.8.6
PSG库的安装** 用清华源下载,从国内的服务器上下载速度很快。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple XX库名
1.1 写一个弹窗
import PySimpleGUI as sg
text='''Python之禅 by Tim Peters
优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
'''
sg.Popup(text)
效果图:
1.2了解模板代码的组成
#1) 导入库
import PySimpleGUI as sg
#2) 定义布局,确定行数
layout=[
[],
[],
[]
]
#3) 创建窗口
window=sg.Window('Python GUI',layout)
#4) 事件循环
while True:
event,values=window.read() #窗口的读取,有两个返回值(1.事件 2.值)
print(event,values)
if event==None: #窗口关闭事件
break
#5) 关闭窗口
window.close()
1.3 根据模板代码写一个界面
import PySimpleGUI as sg
#设置主题
sg.theme('DarkTeal6')
#定义按钮颜色
sg.theme_button_color(('blue','#6D9F85'))
layout = [
[sg.Text('请输入基本信息:')],
[sg.Text('姓名',enable_events=True), sg.InputText('张明明')],
[sg.Text('性别'),sg.InputText('man')],
[sg.Text('国籍'), sg.InputText('cn')],
[sg.Button('确认'), sg.Button('取消')],
]
#打印字體的顔色和背景顔色
print(sg.theme_button_color())
window = sg.Window('window Title', layout)
while True:
event, values = window.read()
#窗口关闭事件
if event is None:
break
#给文本定义弹窗提示
if event == '姓名':
sg.Popup('這是一個文本内容請不要點擊!')
#给确认按钮定义弹窗
if event == '确认':
sg.Popup('执行 确认 任务')
#给取消按钮定义弹窗
if event == '取消':
sg.Popup('执行 取消 任务')
window.close()
1.4 窗口关闭事件
定义窗口关闭事件是至关重要的,当你忘记定义窗口关闭事件,然后又点击了窗口右上角的X按钮,它会默默的消耗你100%的CPU。
import PySimpleGUI as sg
#设置主题
sg.theme('DarkTeal6')
#定义按钮颜色
sg.theme_button_color(('blue','#6D9F85'))
layout = [
[sg.Text('请输入基本信息:')],
[sg.Text('姓名',enable_events=True), sg.InputText('张明明')],
[sg.Text('性别'),sg.InputText('man')],
[sg.Text('国籍'), sg.InputText('cn')],
[sg.Button('确认'), sg.Button('取消')],
[sg.Button('确认1'), sg.Button('1取消')],
]
#打印字體的顔色和背景顔色
print(sg.theme_button_color())
window = sg.Window('window Title', layout)
while True:
event, values = window.read()
#窗口关闭事件
if event is None:
break
#给文本定义弹窗提示
if event == '姓名':
sg.Popup('這是一個文本内容請不要點擊!')
# #给确认按钮定义弹窗
# if event == '确认':
# sg.Popup('执行 确认 任务')
# 给取消按钮定义弹窗
# if event in ('确认','取消'):
# sg.Popup('您执行了 确认或者取消 任务')
#多个按钮事件头部包含确认可以用这个
if event.startswith('确认'):
sg.Popup('您执行了 确认或者确认1 的任务')
# 多个按钮事件尾部包含取消可以用这个
if event.endswith('取消'):
sg.Popup('您执行了 取消或者取消1 的任务')
window.close()
1.5 通过字典获取返回值values
界面默认的返回值是通过列表索引获得指定值, 但是当给元素设定唯一标识符`key`,则该元素无法通过列表索引,只能通过字典key进行索引。`print(values[key])`
```
layout=[
[sg.In()],
[sg.In(key='-IN2-')],
[sg.In()],
[sg.B('print')]
]
...
if event=='print':
print(values)
print(values[0])
print(values[1])
print(values['-IN2-'])
```
import PySimpleGUI as sg
layout = [
[sg.Text('请输入基本信息:')],
#enable_events定义定义点击文字有提示
[sg.Text('姓名',enable_events=True), sg.InputText('张明明')],
#
[sg.Text('性别'), sg.InputText('男',key='-Input_Sex-')],
[sg.Text('国籍'), sg.InputText('国籍')],
[sg.Button('确认'), sg.Button('取消')],
[sg.Button('确认1'), sg.Button('1取消')],
]
window = sg.Window('window Title', layout)
while True:
event, values = window.read()
if event is None:
break
if event == '确认':
# print(values['-Input_Sex-'])
print(values[1])
# #给文本定义弹窗提示
if event == '姓名':
sg.Popup('這是一個文本内容請不要點擊!')
# #给确认按钮
# if event == '确认':
# sg.Popup('执行 确认 任务')
# if event in ('确认','取消'):
# sg.Popup('您执行了 确认或者取消 任务')
# #多个按钮事件头部包含确认可以用这个
# if event.startswith('确认'):
# sg.Popup('您执行了 确认或者确认1 的任务')
# # 多个按钮事件尾部包含取消可以用这个
# if event.endswith('取消'):
# sg.Popup('您执行了 取消或者取消1 的任务')
window.close()
1.6 自定义主题
主题theme包括: 窗口的背景颜色,文本Text颜色,按钮的字体颜色和按钮颜色等等。
默认主题:`"Dark Blue 3" `
如何直观查看有效主题?
```
import PySimpleGUI as sg
sg.theme_previewer()
```
如何获取有效主题。
```
import PySimpleGUI as sg
print(sg.theme_list())
```
**2.如何设定主题?**
`sg.theme('主题名称')`
如何随机主题,
sg.theme('主题名称')
`sg.theme('')`
**3.如何修改主题部分的设置**
```
'LightGreen3': {'BACKGROUND': '#A8C1B4',
'TEXT': 'black',
'INPUT': '#DDE0DE',
'SCROLL': '#E3E3E3',
'TEXT_INPUT': 'black',
'BUTTON': ('white', '#6D9F85'),
'PROGRESS': DEFAULT_PROGRESS_BAR_COLOR,
'BORDER': 1,
'SLIDER_DEPTH': 0,
'PROGRESS_DEPTH': 0}
```
```
theme_background_color
theme_border_width
theme_button_color
theme_element_background_color
theme_element_text_color
theme_input_background_color
theme_input_text_color
theme_progress_bar_border_width
theme_progress_bar_color
theme_slider_border_width
theme_slider_color
theme_text_color
```
import PySimpleGUI as sg
sg.theme('LightGreen3')
sg.popup('LightGreen3 Theme', '按钮文字是白色的'')
# 修改部分主题设定
sg.theme_button(('black', '#6D9F85'))
sg.popup('修改后的LightGreen3 Theme', '按钮文字是黑色的')
1.7 自定义窗口
目标:
1. 利用for循环快速定义元素
2. 布局和元素的另一种组合方式
Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。<font></td></tr></table>**
```
# for循环遍历字符串
str_a='abcd1234'
for i in str_a:
print(i)
# for循环遍历列表
list_a=[1,4,'A','张三']
for i in list_a:
print(i)
```
layout=[[sg.In(i) for i in 'ABCD']]
layout=[[sg.In(i)] for i in ['江苏','上海','广东']]
```
for 循环前面是个小括号时,从左向右遍历。
for 循环前面是个中括号时从上向下遍历
1.8 布局和元素的组合的另一种方式
最常见的布局定义方式
```
layout=[
[sg.Text('请输入基本信息')]
[sg.Text('姓名'),sg.In()],
[sg.Text('性别'),sg.In()],
[sg.Text('国籍'),sg.In()],
[sg.B('确认'),sg.B('取消')]
]
```
```
layout_bottom=[[sg.B('Exit')]]
layout=layout+layout_bottom
```
元素间除了用 `,`隔开以外,还可以用`]+[`替代。
```
layout=[
[sg.Text('请输入基本信息')],
[sg.Text('姓名')]+[sg.In()]]+[
[sg.Text('性别')]+[sg.In()]]+[
[sg.Text('国籍'),sg.In()],
[sg.B('确认'),sg.B('取消')]]
]
```
2.1文本元素介绍
一般是指单行文本,也可以指多行文本,多行文本时也不会出现滚动条。
`sg.Text('')`,支持简写`sg.T('')`
```python
Text(
text="",
# str:要显示的文本。可以包含/n以实现多行。
key=None,
# [str, int, tuple, object]:
# 元素唯一标识符,
# 书写规范 key='-NMAE-'。用于元素的定位。
size=(None, None),
# (int, int): 元素宽度,行高
font=None,
# 设定字体的名称,大小
# font='宋体'
# font=('宋体',int) or font=['宋体',int]
auto_size_text=None,
# bool: 元素根据文本自动调节大小
enable_events=False,
# bool: 事件属性,设定为True时,点击文本发生事件。
relief=None,
# 浮雕设计 'raised','sunken','flat','ridge','solid','groove'
border_width=None,
# 设定relief时,用来设定边界宽度
text_color=None,
# 文本颜色
background_color=None,
# 文本背景颜色
justification=None,
# 对齐方式: 'left','right','center'
pad=None,
# 元素间隔设定 记住左右上下
# (int, int) or ((int, int),(int,int))
# or (int,(int,int))or ((int, int),int)
# (left/right, top/bottom) or ((left, right), (top, bottom))
right_click_menu=None,
# 右击调出菜单 List[List[Union[List[str],str]]]
# 设定后,右击此元素可以调出菜单。
grab=False,
# bool:如果为真,点此元素可以移动拖拽窗口
tooltip=None,
# str:悬浮文本 ,当光标置于该元素上方,会显示设定的文本。
visible=True
# bool: 元素可见状态
)
```
例子:
import PySimpleGUI as sg
text = '''
python 之禅达 by tim
优美的不错的PU 皮呕 做吧大大大大大大大大的5
这是一个全新的世界
'''
layout = [[sg.T(text,
key='-TEXT-',
size=(50, 12),
font=('宋体', 15),
auto_size_text=True,
enable_events=True,
relief='raised',
border_width=5,
text_color='yellow',
background_color=None,
grab=True,
pad=None,
justification='r',
right_click_menu=['1', ['1', ['1-1', '1-2'], '2', ['2-1', '2-2'], '3',['3-1', '3-2']]],
tooltip='这是个多行文本',
visible=True,
)]
]
window = sg.Window('window Title', layout, keep_on_top=True)
while True:
event, values = window.read()
print(event)
if event is None:
break
# if event == '-TEXT-':
# sg.popup('点击文本发生一个事件')
window.close()
**Update方法,用于元素的更新!**
window[key].update()`
`window[key].Update()`
**元素可以更新的属性只有如下几种:**
```python
update(
value=None,
# str 更新文本
background_color=None,
# str 更新文本背景颜色
text_color=None,
# str 更新文本颜色
font=None,
# 更新字体的名称或者大小
visible=None
# 更新元素的可见状态
)
```
- 更新文本显示
`window[key].update(value='')` or `window[key].update('')`
- 更新文本背景颜色
`window[key].update(background_color='red')`
- 更新文本颜色
`window[key].update(text_color='yellow')`
- 更新字体名称或者大小
`window[key].update(font='黑体')` or `window[key].update(font=('',22))`
- 更新元素的是否可见
`window[key].update(visible=False)`
代码案例:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
layout = [
[sg.Button('中文'),sg.Button('English')],
[sg.Text('请输入基本信息',size=(40,1),key='-title-')],
[sg.Text('姓名:',size=(8,1),key='-NAME-'), sg.InputText('xxx')],
[sg.Text('性别:',size=(8,1),key='-SEX-'), sg.InputText('xx')],
[sg.Text('国籍:',size=(8,1),key='-CONTRY-'), sg.InputText('xx')],
[sg.Button('确认',key='-CONF-'), sg.Button('取消',key='-CANCEL-')],
]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
if event == None:
break
if event == 'English':
window['-title-'].update('请输入基本信息')
window['-NAME-'].update('姓名:')
window['-SEX-'].update('性别:')
window['-CONTRY-'].update('国籍:')
window['-CONF-'].update('确认')
window['-CANCEL-'].update('取消')
if event == '中文':
window['-title-'].update('Please enter basic information')
window['-NAME-'].update('NEME:')
window['-SEX-'].update('SEX:')
window['-CONTRY-'].update('Nationlity:')
window['-CONF-'].update('Confim')
window['-CANCEL-'].update('Cancel')
window.close()
2.2 单行输入框元素介绍
`sg.InputText()`支持简写`sg.In()`
```python
InputText(
default_text='',
# 默认值设定,可以为空字符串。
# Any
key=None,
# 元素的唯一标识符
# 规范 key='-INPUT-'
size=(None, None),
# 宽,高
disabled=False,
# bool :元素禁用,
# 如果为True则禁用,无法输入任何值。
password_char="",
# 密码字符,一般设置为*
justification=None,
# 对齐方式 'r','l','c'
background_color=None,
# 输入框的颜色
text_color=None,
# 输入框的文本颜色
font=None,
# 输入框字体的名称或者大小设定
tooltip=None,
# str: 悬浮文本
# 当光标置于该元素上方时,设置的文本会显示。
border_width=None,
# 输入框边界线宽度设定
enable_events=False,
# bool : 输入框的事件属性,
# 如果设定为True,输入值时会发生一个事件。
do_not_clear=True,
# bool : 输入框内容不被清除
# 如果为False,一发生事件,该输入框内的值会被清除。
focus=False,
# bool : 设定焦点
# 如果为真,则光标显示在此输入框。
pad=None,
# (int, int) or ((int, int),(int,int))
# or (int,(int,int))or ((int, int),int)
# (left/right, top/bottom) or ((left, right), (top, bottom))
# 元素间隔
disabled_readonly_background_color=None,
# str: 元素禁用时的背景颜色设定
disabled_readonly_text_color=None,
# str: 元素禁用时的文本颜色设定
right_click_menu=None,
# 右击按钮菜单 List[List[Union[List[str],str]]]
# 设定后,右击此元素会调出菜单
visible=True,
# 元素的可见状态
# 如果为False、,则界面不显示该元素。
)
```
例子:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
layout = [
[sg.InputText(
default_text='输入密码六个字',
# 默认值设定,可以为空字符串。
# Any
key=None,
# 元素的唯一标识符
# 规范 key='-INPUT-'
size=(None, None),
# 宽,高
disabled=False,
# bool :元素禁用,
# 如果为True则禁用,无法输入任何值。
password_char="*",
# 密码字符,一般设置为*
justification=None,
# 对齐方式 'r','l','c'
background_color=None,
# 输入框的颜色
text_color=None,
# 输入框的文本颜色
font=None,
# 输入框字体的名称或者大小设定
tooltip=None,
# str: 悬浮文本
# 当光标置于该元素上方时,设置的文本会显示。
border_width=None,
# 输入框边界线宽度设定
enable_events=False,
# bool : 输入框的事件属性,
# 如果设定为True,输入值时会发生一个事件。
do_not_clear=True,
# bool : 输入框内容不被清除
# 如果为False,一发生事件,该输入框内的值会被清除。
focus=False,
# bool : 设定焦点
# 如果为真,则光标显示在此输入框。
pad=None,
# (int, int) or ((int, int),(int,int))
# or (int,(int,int))or ((int, int),int)
# (left/right, top/bottom) or ((left, right), (top, bottom))
# 元素间隔
disabled_readonly_background_color=None,
# str: 元素禁用时的背景颜色设定
disabled_readonly_text_color=None,
# str: 元素禁用时的文本颜色设定
right_click_menu=None,
# 右击按钮菜单 List[List[Union[List[str],str]]]
# 设定后,右击此元素会调出菜单
visible=True,
# 元素的可见状态
# 如果为False、,则界面不显示该元素。
)],
[sg.Button('Print')]
]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
if event == None:
break
if event == 'Print':
print(type(vaules[0]))
window.close()
**SetFocus方法,用于元素设置焦点。**
`window[key].SetFocus()`
`window[key].set_focus()`
**Update方法,用于元素的更新。**
`window[key].update()`
`window[key].Update()`
练习:
import PySimpleGUI as sg
layout=[
[sg.T('输入框小练习!')],
[sg.T('请输入3位数密码')],
[sg.In(tooltip='12?',password_char='*')],
[sg.B('OK')]
]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
password=124
if event==None:
break
if event=='OK':
if values[0]==str(password):
message='输入正确,密码是'+values[0]
else:
message='输入错误,密码不是'+values[0]
sg.Popup(message,keep_on_top=True)
window.close()
运行程序
2.3 按钮元素介绍
`sg.Button('')`,支持简写`sg.B('')`
```python
Button(
button_text="",
# 显示在按钮上的文本
key=None,
# 元素的唯一标识符
tooltip=None,
# 悬浮文本
disabled=False,
# 元素禁用设定,如果为True,点击按钮也无法发生事件。
image_filename=None,
# 图片路径,按钮用图片表示
# 只支持GIFs和PNGs格式
# 和image_data二选一使用
image_data=None,
# 图片base64格式,按钮用图片显示
# 和image_filename二选一使用
image_size=(None, None),
# 按钮图片大小
image_subsample=None,
# 图片大小设定
# 为2时→原图片的二分之一大小
# 2=1/2, 3=1/3, 4=1/4, etc
border_width=None,
# 按钮边界线设定
size=(None, None),
# 按钮尺寸设定
auto_size_button=None,
# 按钮上的文本自动调节
button_color=None,
# 按钮颜色
disabled_button_color=None,
# 按钮元素禁用时显示的按钮颜色
font=None,
# 字体名称,大小设定
bind_return_key=False,
# 绑定回车键
# 如果设定为True,回车键会使此元素被点击。
focus=False,
# 焦点设置
pad=None,
# 和其他元素之间间隔设定
visible=True,
# 元素的可见状态设定
# 如果为True,元素则不可见。
)
```
元素更新
```python
Update(
text=None,
# 按钮上显示的文本
button_color=(None, None),
# 按钮颜色
disabled=None,
# 元素禁用设定
image_data=None,
# 图片的base64格式
image_filename=None,
# 图片的路径
visible=None,
# 元素可见状态设定
image_subsample=None,
# 元素大小设定
disabled_button_color=(None, None),
# 元素禁用时显示的文本和按钮颜色
image_size=None
# 图片尺寸设定
)
```
小练习:
import PySimpleGUI as sg
layout = [[
sg.B('开始', key='-START-', font=('宋体', 16), button_color=('black', 'yellow')),
sg.B('重置', key='-RESET-', font=('宋体', 16), button_color=('black', 'green')),
sg.B('结束', key='-STOP-', font=('宋体', 16), button_color=('black', 'red'))
]]
window = sg.Window('Python GUI', layout, keep_on_top=True)
while True:
event, values = window.read()
print(event)
if event == None:
break
if event == '-START-':
window['-START-'].update(disabled=True, button_color=('grey', 'grey'))
window['-RESET-'].update(disabled=False, button_color=('black', 'yellow'))
if event == '-RESET-':
window['-START-'].update(disabled=False, button_color=('black', 'yellow'))
window['-RESET-'].update(disabled=True, button_color=('grey', 'grey'))
window.close()
列表 listbox
列表 Listbox
`sg.Listbox()`or `sg.LB()`
```python
Listbox(
values,
# 列表或者元祖等
default_values=None,
# 默认选中的值或者列表
key=None,
# 元素的唯一标识符
select_mode=None,
# 选择模式,有效值包含如下4种。
# single ,单选,更换时点击选择
# multiple ,可以多选,逐一点击选择
# browse ,单选,鼠标按住也可以更换选择
# extended ,可以多选,鼠标按住也可以扩展选择
enable_events=False,
# 元素的事件属性
# 如果设定为True,元素列表项目被选中时会发生事件。
bind_return_key=False,
# 绑定回车键
# 如果设定为True,回车键被按下时相当于此元素被点击
size=(None, None),
# 字符宽度,行高
disabled=False,
# 元素是否禁用
auto_size_text=None,
# 如果为True,元素自动根据内容大小调整
font=None,
# 设置字体名称或者大小
no_scrollbar=False,
# 如果为True,则没有滚动条
background_color=None,
# 背景颜色设定
text_color=None,
# 字体颜色设定
pad=None,
# 元素间隔设定
tooltip=None,
# 悬浮文本
right_click_menu=None,
# 右击调出菜单
visible=True,
# 元素可见状态设定
)
```
元素可以更新的属性只有如下几种:**
```python
Update(
values=None,
# 元祖或者列表,举例如下
# values=[1,3]
# values=(1,3)
disabled=None,
# bool : 更新元素是否禁用,举例如下
# disabled=True
# disabled=False
set_to_index=None,
# 高亮显示设定的索引,Union[int, list, tuple],举例如下
# set_to_index=1
# set_to_index=[1,2]
# set_to_index=(1,2)
# 注意!单击只是高亮显示,并未选中。双击才是高亮显示+选中。
# 单击获取值时,不用valuse(key),而是window[key].get()
scroll_to_index=None,
# int : 将设定的索引跳到要显示第一行
select_mode=None,
# 更新元素的选择模式,有效值包含如下4种
# single ,单选,更换时点击选择
# multiple ,可以多选,逐一点击选择
# browse ,单选,鼠标按住也可以更换选择
# extended ,可以多选,鼠标按住也可以扩展选择
visible=None
# bool: 更新元素的可见状态
# visible=True
# visible=False
)
```
小例子:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
hob = ['看书','电影','音乐','打球','运动','美食','写代码']
pet = ['狗','猫','鸟']
layout = [
[sg.Listbox(hob,
# 列表或者元祖等
default_values='运动',
# 默认选中的值或者列表
key='-LB-',
# 元素的唯一标识符
select_mode='multiple',
# 选择模式,有效值包含如下4种。
# single ,单选,更换时点击选择
# multiple ,可以多选,逐一点击选择
# browse ,单选,鼠标按住也可以更换选择
# extended ,可以多选,鼠标按住也可以扩展选择
enable_events=True,
# 元素的事件属性
# 如果设定为True,元素列表项目被选中时会发生事件。
bind_return_key=True,
# 绑定回车键
# 如果设定为True,回车键被按下时相当于此元素被点击
size=(20, 6),
# 字符宽度,行高
disabled=False,
# 元素是否禁用
auto_size_text=None,
# 如果为True,元素自动根据内容大小调整
font=None,
# 设置字体名称或者大小1
no_scrollbar=True,
# 如果为True,则没有滚动条
background_color=None,
# 背景颜色设定
text_color=None,
# 字体颜色设定
pad=None,
# 元素间隔设定
tooltip=None,
# 悬浮文本
right_click_menu=None,
# 右击调出菜单
visible=None,
# 元素可见状态设定
)]
]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
print(event)
if event == None:
break
if event == '-LB-':
sg.popup('选中的值是:',vaules['-LB-'])
window.close()
案例2
import PySimpleGUI as sg
hob = ['看书', '电影', '音乐', '打球', '运动', '美食', '写代码']
pet = ['狗', '猫', '鸟']
select_mode = ['single','multiple','browse','extended']
layout = [[sg.Listbox(hob, size=(20, 6), key='-LB-', no_scrollbar=True)]]+\
[[sg.Button('PET'),sg.Button('HOB')]]+\
[[sg.Button('set_to_index_2')],
[[sg.Button('scroll_to_index_2')]],
[[sg.Button(i) for i in select_mode]]
]
window = sg.Window('python gui', layout, keep_on_top=True)
while True:
event, vaules = window.read()
key = '-LB-'
if event == None:
break
# if event == '-LB-':
# sg.popup('选中的值是:', vaules['-LB-'])
if event == 'PET':
window[key].update(values=pet)
if event == 'HOB':
window[key].update(values=hob)
if event == 'set_to_index_2':
window[key].update(set_to_index=[1,2])
print(window[key].get())
if event == 'scroll_to_index_2':
window[key].update(scroll_to_index=1)
if event == select_mode[0]:
window[key].update(select_mode=event)
if event == select_mode[1]:
window[key].update(select_mode=event)
if event == select_mode[2]:
window[key].update(select_mode=event)
if event == select_mode[3]:
window[key].update(select_mode=event)
window.close()
案例3 密码选中展示
import PySimpleGUI as sg
accounts = {'賬號1':'12345','賬號2':'6789','賬號3':'9111213','賬號4':'112345'}
list_Acc = []
for k in accounts:
list_Acc.append(k)
layout = [
[sg.LBox(list_Acc,size=(18,8),key='-LB_Acc-',enable_events=True,no_scrollbar=True,font=('宋体',18))],
[sg.Text('密码:'),sg.InputText(key='-INPUT_PW-',size=(23,1))]
]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
if event == None:
break
if event == '-LB_Acc-':
# print(vaules['-LB_Acc-'][0])
#获取数值
window['-INPUT_PW-'].update(accounts[vaules['-LB_Acc-'][0]])
#指定光标
window['-INPUT_PW-'].set_focus()
#选中内容
window['-INPUT_PW-'].update(select=True)
window.close()
2.4 下拉菜单
输入框和下拉菜单的一个组合部件
sg.Combo()`or`sg.InputCombo()`or`sg.DropDown()`or`sg.Drop()`
```python
Combo(values,
# List[Any] or Tuple[Any]
# 显示下拉菜单信息,列表或者元祖
default_value=None,
# initial value
# 默认选中
key=None,
# 唯一标识符
size=(None, None),
# 元素宽度,行高
auto_size_text=None,
# 元素根据文本自动调节
background_color=None,
# 背景颜色设定
text_color=None,
# 文本颜色设定
enable_events=False,
# 元素事件属性
# 如果设定为True,当元素被选中时,会发生一个事件。
disabled=False,
# 元素禁用状态设定,
# 设定为True时,元素不能进行选择,也不能输入。
pad=None,
# 元素间隔设定
tooltip=None,
#str: 悬浮文本设定
readonly=False,
# 元素只读属性,只能选择,不能输入内容。
font=None,
# 元素字体名称或者大小设定
visible=True,
# 元素可见状态设定
)
```
和Listbox最大的区别在于,可以输入,但是不能多选。
Listbox取得的值是存放在列表里面,
但是Combo取得的值是对象本身。
2.5 选择菜单
`sg.OptionMenu()`
OptionMenu只有tkinter端口才有此元素,其他三个端口没有。
此元素和设置了只读属性的ComboBox很像。
OptionMenu没有`font`属性,也没有 `enable_events` 事件属性
```python
OptionMenu(values,
default_value=None,
key=None,
size=(None, None),
disabled=False,
auto_size_text=None,
background_color=None,
text_color=None,
pad=None,
tooltip=None,
visible=True,
)
```
**Update方法,用于元素的更新。**
`window[key].update()`
`window[key].Update()`
**元素可以更新的属性只有如下几种:**
```python
Update(
value=None,
# 更新默认选中的元素
values=None,
# 更新所有显示的文本选项
disabled=None,
# 更新元素的禁用状态
visible=None
# 更新元素的可见状态
)
```
**元素可以更新的属性只有如下几种:**
```python
Update(
value=None,
# 更新默认选中的元素
values=None,
# 更新所有显示的文本选项
disabled=None,
# 更新元素的禁用状态
visible=None
# 更新元素的可见状态
)
```
2.6 旋转按钮
特征: 含有向上向下两个箭头按钮

```python
Spin(values,
initial_value=None,
key=None,
disabled=False,
enable_events=False,
size=(None, None),
auto_size_text=None,
font=None,
background_color=None,
text_color=None,
pad=None,
tooltip=None,
visible=True,
)
```
2.7 单选框 Radiobox
`sg.Radio()`or`sg.R()`
```python
Radio(text,
# str 文本用于显示在单选框旁边
group_id,
# any
# 组ID
key=None,
# 元素的唯一标识符
default=False,
# bool 如果为True,则默认选中
disabled=False,
# 设定禁用状态
size=(None, None),
# 设定元素宽度,行高
auto_size_text=None,
# bool 默认为True
# 元素根据文本自动调整大小
background_color=None,
# 元素背景颜色
text_color=None,
# 元素文本颜色
font=None,
# 字体名称和大小设定
# (str,int)
pad=None,
# 左右上下 (int,int)or((int,int),(int,int))
# 元素间隔设定
tooltip=None,
# 悬浮文本设定
enable_events=False,
# 元素事件属性
# 当设定为True时,选框被选中时会发生事件
visible=True,
# 设定元素的可见状态
)
```
课程例子:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
list_coment = ['非常满意','满意','一般','不满意']
list_id = ['1.请对小A服务进行评价.','2.请对小B的服务进行评价.']
layout = [
[sg.Text(list_id[0])],
[sg.Radio(i,group_id=1)for i in list_coment],
[sg.Text(list_id[1])],
[sg.Radio(i, group_id=2) for i in list_coment],
]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
if event == None:
break
window.close()
例子2
import PySimpleGUI as sg
sg.theme('DarkTeal6')
list_coment = ['非常满意','满意','一般','不满意']
list_id = ['1.请对小A服务进行评价.','2.请对小B的服务进行评价.']
layout = [[sg.Text(list_id[0])]]+\
[[sg.Radio(i,group_id=1)]for i in list_coment]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
if event == None:
break
window.close()
例子3
import PySimpleGUI as sg
sg.theme('DarkTeal6')
list_coment = ['非常满意','满意','一般','不满意']
list_id = ['1.请对小A服务进行评价.','2.请对小B的服务进行评价.']
layout = [[sg.Text(str(y+1)+'.')]+[sg.Radio(text=x,group_id=y,key=(x,y))for x in list_coment]for y in range(9)]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
if event == None:
break
**ResetGroup方法,相同组ID的单选框都更新为未选中状态。**
`window[key].ResetGroup()`
`window[key].reset_group()`
2.8 复选框 Checkbox
`sg.Checkbox()`or `sg.CB()`
```python
Checkbox(
text,
# 文本显示在选框旁边
default=False,
# bool 如果为True,则选中
size=(None, None),
# 尺寸设定,元素的宽度和行高
auto_size_text=None,
# bool 默认为True
font=None,
# (str,int)字体的名称和大小设定
background_color=None,
# 背景颜色设定
text_color=None,
# 字体颜色设定
enable_events=False,
# bool 元素的事件属性
disabled=False,
# bool 元素的禁用状态
key=None,
# 元素的唯一标识符
# 规范key='-CHECKBOX-'
pad=None,
# 和周围元素的间隔((int,int),(int,int)) 左右上下
tooltip=None,
# str 悬浮文本设定
visible=True,
# bool 元素的可见状态设定
)
```
例子:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
Animal = ['长颈鹿','老虎','狮子','大笨象','牛','羊']
layout = [[sg.Text('选择你喜欢的动物吧!')]]+\
[[sg.Checkbox(i)] for i in Animal]+\
[[sg.OK()]]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
print(vaules)
if event == None:
break
window.close()
复选框升级案例
import PySimpleGUI as sg
sg.theme('DarkTeal6')
Animal = ['长颈鹿','老虎','狮子','大笨象','牛','羊']
layout = [[sg.Text('选择你喜欢的动物吧!')]]+\
[[sg.CB(i)] for i in Animal]+\
[[sg.B('update')]]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
print(vaules)
if event == None:
break
if event == 'update':
for i in range(6):
window[i].update(
value=False,
text=None,
background_color='yellow',
text_color='red',
disabled=None,
visible=None
)
window.close()
2.9 滑块 Slider
滑块,有水平方向的也垂直方向的。
`sg.Slider()`
```python
Slider(
range=(None, None),
# 滑块范围(最小值,最大值)
key=None,
# 元素的唯一标识符 规范书写key='-SLIDER-'
default_value=None,
# 滑块初始所处位置
resolution=None,
# 滑块值变动的最小单位值
tick_interval=None,
# 刻度值标记
orientation=None,
# 方向设定 水平方向或者垂直方向
# 有效值'horizontal' or 'vertical'
# 支持简写:'h' or 'v'
disable_number_display=False,
# bool 默认为False,如果为True,滑块旁的数字不显示。
border_width=None,
# 边界线宽度
relief=None,
# 浮雕设计
# 'raised','sunken','flat','ridge','solid','groove'
enable_events=False,
# 元素的事件属性
disabled=False,
# 元素禁用状态设定
size=(None, None),
# 元素的尺寸设定 宽度和行高
font=None,
# 字体名称和大小设定
background_color=None,
# 滑块背景颜色设定
text_color=None,
# 元素文本颜色设定
pad=None,
# 元素间隔设定((int,int),(int,int))
tooltip=None,
# 元素悬浮文本设定
visible=True,
# 元素可见状态设定
)
```
`sg.theme_slider_color('')`
练习:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
layout = [
[sg.Slider(key=i,range=(1,500),
default_value=100*(i+2),
resolution=None,
# 滑块值变动的最小单位值
tick_interval=None,
# 刻度值标记
orientation=None,
# 方向设定 水平方向或者垂直方向
# 有效值'horizontal' or 'vertical'
# 支持简写:'h' or 'v'
disable_number_display=False,
# bool 默认为False,如果为True,滑块旁的数字不显示。
border_width=None,
# 边界线宽度
relief=None,
# 浮雕设计
# 'raised','sunken','flat','ridge','solid','groove'
enable_events='raised',
# 元素的事件属性
disabled=False,
# 元素禁用状态设定
size=(12, 20),
# 元素的尺寸设定 宽度和行高
font=None,
# 字体名称和大小设定
background_color='blue',
# 滑块背景颜色设定
text_color='red',
# 元素文本颜色设定
pad=None,
# 元素间隔设定((int,int),(int,int))
tooltip=None,
# 元素悬浮文本设定
visible=True,
# 元素可见状态设定
) for i in range(3)]
]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
print(vaules)
if event == None:
break
window.close()
2.10 图片显示 Image
`sg.Image()`
```python
Image(
filename=None,
# 图片路径仅支持GIF和PNG
data=None,
#base64编码的字符串
background_color=None,
#背景颜色设定
size=(None, None),
# 图片 宽度和高度设定(pix)
pad=None,
#和周围元素间的间隔 ((int,int),(int,int))
# 左右上下顺序
key=None,
# 元素的唯一标识符
tooltip=None,
# 元素的悬浮文本
right_click_menu=None,
# 右击调出菜单 ['开始',['开始','中止','结束']]
visible=True,
# 元素可见状态 bool
enable_events=False,
# 元素事件属性,默认为False
)`sg.Image()`
```python
Image(
filename=None,
# 图片路径仅支持GIF和PNG
data=None,
#base64编码的字符串
background_color=None,
#背景颜色设定
size=(None, None),
# 图片 宽度和高度设定(pix)
pad=None,
#和周围元素间的间隔 ((int,int),(int,int))
# 左右上下顺序
key=None,
# 元素的唯一标识符
tooltip=None,
# 元素的悬浮文本
right_click_menu=None,
# 右击调出菜单 ['开始',['开始','中止','结束']]
visible=True,
# 元素可见状态 bool
enable_events=False,
# 元素事件属性,默认为False
)
**f-string 格式化字符串常量(formatted string literals)**
案例:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
image_path = r'图片'
layout = [
[sg.Image(filename=image_path+f'{i}.png') for i in range(1,6)]
]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
print(vaules)
if event == None:
break
window.close()
base64 格式的代码形式
import PySimpleGUI as sg
sg.theme('DarkTeal6')
ͼƬ1 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAJ5SURBVGhD7dvLTttAFMbx4xCcWxEuoGxg0bJB6T0mBBa8CFLfo8/Q96jUF2FHYFUqxIJ2QRGNqm5QlSsxmcEHmRSDnWQ854zzR4hgImV+X7hkg/X5y1cPUtanj3tWxr+duu6ecXd3V14wuaP9ffkx1c/4DJ62jIRf9/v+rfCMgndabfh5egpnJyf+lfCMgCP4uNHw/jabAN7TL01Yw+/Ahz7YGr5FjCX8P/CQ3G234d/Vlfx6lFjBw8B/fl/K9163I+8XJRbwABgeAovbcSMNfwAskZOAMZJwlWCMFBzB3xWCMRLwUbD4K6wKjGmF6wBjWuC9bk8bGEsULsDnZz/g28GBNjCWCDwIbl78Gr6UHmgDY0rhCD5u0AFjSuCj4MGADhibKpwDGJsKnBMYmwjOEYyNBecMxmLBTQBjkeAmgbFH4SaCsVC4eEkZBHueJ69xB2Oh8KVyGV5sbMBcdr4lPrcsC5yVFVhYdCCTifWrgWSPCpzlZXi/s11Yr1SGA9gtAV5wHCivrrEfINLJbweoywGytt0xYYBYJxYDvKvXcyYMMNZJgwPM53JdjgNMdEIxwNutLVsMYOfzrAaYysnEAG9qNVYDTPVEwQFy+UKf8gBKTiIGeF3bzFIeQOkJKA+QyCPfG6BYvKYwQKKPKAdw3TkKA2j5XqMwgBY4FhygUCwNkhxAKxwTA1TcaibJAUjAsSQHIAXHggPkiyVPxQAk4ZgY4JVbtVQMQBqOBQcolJ5J8KQDsIBj8keg+gHCBrBiDMAKjoUNsPh8yb/H07GEY6MDxIk1HBtnACPgGA6wtv7SvxKeUXAsyrNuJDxKM3jamv2L5axUBHAD581flhCfpAwAAAAASUVORK5CYII='
ͼƬ2 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAJWSURBVGhD7dtPTxpBHMbx3+6yLK0NRg/YpCT1oodWPSCiJr4Rk76Pvoa+jyZ9I1xFT+XGhcR/COGAoPyVHXmaHtZhkN3ZmVm+CWGZcPk8LNywfv3+M6GE9fPHuWXPrhPXv0+8cHbGDkyuUi6z50R/4it40uLCR8Ph7Mq8uPB6rUa1apV6j53ZiTnNvdXbzSZVL6+MG0D4O27aAELwbqfDHjSZGDOAENz/kWs3H+ju+tqYAYRvdb/RcGDMAAvBkQkDvAuOdB5gKTjScYBQ4EinAUKFIx0GiASOVB4gUjhScQApcPT/AE/dR3YW1wBS4cgfoNVoUONmOkCvy85kDxALHA36fWrd38cyQKxwFMcASsCRzAGUgiMZAygJR1EOoDQcRTGAFnAU5gBawdG8AZ57T+yMl5ZwhAEebm9oPB6zM3+Av5ULuq3X2eu30hpuWRatZbO0kcuRbb9SHMd5/rqzQ1v5PHv9VlrCAc5Ncesbm+TYzhRs97d3d+ng5MTbnA7hv4eXVvAgcCrlzsCnaREw0gLOA+8flxYCI6XhgWDXHSwDRkrCg8CumxoycKnkLgNGSsF54L3ScSoMMFICHgj20qMowChWOBdcPHKiAKNY4HGCkVR4EDjtpccywUgKnAf+XjyyZYJRpHAVwSgSeDDYm6gARqHC+eCipQIYhQLXCYyWggeBvYzaYPQuOA/87VBtMFoIHgj+kCGdwEgIbtkccOGQdAIjIfin7LoxYCR8q5sCRnPhpoERF/75S944MOLCM2sfjQMj4e+4aa3gSWv1F8tViYjoBXy8SJbXZKzgAAAAAElFTkSuQmCC'
ͼƬ3 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAJpSURBVGhD7ZrdbtMwFIBPmp+mbZKuVVRQQaK9YOOCaRPSuNqLIPEePAPvgcSL7G4SN0OCDRATKmJsYe20dc3apsF2TOm6UuKqtHjHn3RUx85FvxzHcY6ivXz1OgZkvHj+TMvwNjqGGX+yvc06bjNvdnbYL+qMK3FsKHFsKHFsKHFsKHFsKHFsKHFsTBU/ajTgw97etTg9PuajcjO1EHF4cHBDNGMYYOg6P1oc9+p1KPk+P5oN4ULE5cUFhGGHtQf9PnSvrhYen9+9j5tBwP7DPEiV8fNWCzqXbcgsIdMUx3XBzhdA0zR4tLkBuYLDRxLoBTnc34c4TuqmbrEID9fXWXuUmUpP/V4PumG4lDglYr1el4k1TwI4PzsbRnD07Zp0WuRY1YlUHA1Yc3zB/fLxE5MOyYxs/Uh/K0jzOIuiCCKyvkyKTrvNZoUI0og3gxP4/rUxMegYnRUiCIkXS2WoPqixsGyb98pJKnF3ZYXJFjyP98iP8FSnj5TbwFTx2uoqe76PhmlZfFRupFnc5o0Sx4YS/9+hiyrdO4yHbpj8DDGkEaebJ//O3RtRqVbZm5so0k11wzTBymZZmJbJ9hVl3xeWl078fr0Oj7e2eDxNqjJEnvzGjlfkZ/0dqRc3mu3a2hqTJ22Nzoa0CH/883Z3l5WCaClq0I94778nm8+BntHZbrJcqfDehKRAQd7QOPQCeKUSP/rNXD7+se0c5B1nYUGl/wS7z8nF+BWTpMcRzjitb8WDpBqyDAquB9ncbK/EoxlX37lhQ4ljQ4ljQ4ljQ4ljQ4ljQ4ljQ4ljA634sBCBCdSFCKQA/ASBZ6zjcvksuwAAAABJRU5ErkJggg=='
ͼƬ4 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAMwSURBVGhD7ZvdThpBGEC/5R8LggJWe9XWRMVqL/ypN75Ik75Hn6Hv0aQv4rU2etHGprVJRVu1RQoiUGE733SGTlaERXZnvwVOMsHdTIxnzs4KxjXevH1nwojx+tVLIyC+Hjnaxde2t/mJYWZ3Z4e/jnTxsfio0VW8Wq6AaQ7nTb+r+NnpCRzu70PtuirO0KFwdARfDw87ju/Hx2LW3fS81K/KZfiwu2f+KBRI1S9eXMCvs7OOo1wsill3Y2uPM2EDV5hi/WqlAuXLSz76+dlsiTdqdWi1WqL+e6BUv3rFxEtMnI1a1WHxeu0azk8KfEVNs8X3F9W9bxdb4kiz2eT75/Lnxf/6e7Tq94NtcQnuqXZ9tgB+rd+3ODIM9e8lLvFz/YHEkU71P/qg/sDiErU+LgD1+o6JI36q76i4xA/1XRFHqNd3TVxCtb7r4oilvinrn5+cihn60SIuEfUNWf/bl8/w6eAAGvW6mKEPreKItX65VGKf+Ha119cuLlHr42Loru+ZOOJlfU/FJV7UJyGO6K5PRlyiqz45cUTWr/wu8WNZH//O7xQkxcEwIJlKQyI5KQ6NxuPFRZhIJvixE5ATD0cikJudg2Q6zRcglck0nm9tRVLT02KGM9ARF5VRGuUDgeCf+eVlmM/nI8FQSExyDhLi1srpTOZm9cVm2OnKKt6KWysH/1V+ms+H3Kis4pm4tfJ0Ltda3XS3sop+cUtlVvYGK7O7dsDtyipaxTtVXtnYCOmqrKJH/FblcNOLyiqui9+qPDMDKxvrQS8qq7gmzt5tweTUVLtyKBxu8coLC7ivxSzvcEU8Eo1Cbu4RJCZT7crP1tcDXldWcVRcVs4+nMXCWJpUZRXHxDtVXl5bI1VZZWBxa2U2TKqVVQYSt1aeymZxLxtUK6vcS9xaGcs+WVrig3Jllb7F76jMX/2EbfFulfHYb9gSD0fZu68hqKxiSzwWn5B3bHKVY/E4TCQSfESiMXG2N7YvdazLfi+Tq4xXYTqT5QPl7dJTnGJlJJFMsk98qY4j/qD3AnR9JgX/Qxi/ESXhQbD9TApe1sMibcX2Hh82xuKjxvgRyzEjAcBfnIZW0hne4u4AAAAASUVORK5CYII='
ͼƬ5 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAMTSURBVGhD7Ztra9pQGIBPksVcdOtFLVNcKfVL6y6t9oIf+kcG+x/7Dfsfg/2RftV+moPSwmAfJh2Tts5qEmt23tOkPZNpUzhJ3qgPHNQoeJ7zmAtIpE+fv7hkzvj44b0ke8/njvvitaMjtmGWaR4fs8e5Lr4QnzdmUnzQv/GeTWaq+O92m3w/PZ04sHE7HLJ5/Tg797ZMZqp49/qadC4uJg5MXHU65GujMQo6r0A/dXswIN3LSzZ6dDEw4Vc+b7XI0HEC77qBPmiB+BUVp+NPF484VG41m3eVXZcGsrx3HifwCmGCr+zYtkwH+dX+SW56Xe8Tj5M4cW9fdv3KsPuBNMg/hcSIj+3Lkl8Zdj9YgKeSCHFRlXlQi4uuzINWnB2xG02hlXnQif9zxHZsoZV5UIl75+W7q8IQKvOgEB87L7MRRmWe2MWjrMwTm3gclXliEY+rMk+k4nFX5olMHCp/OzmJtTJP6OJ8ZduyYq3ME6o4tso8oYhjrcwjXBxzZR5h4kmozCNE3LGdh8oUq99HWZlHiLiaUkm5sk0URenBa80wyGouR2QllEOIEITNzEhnyLt6PZ0vFC2XoptpslYoEXjEiNAkkiSRV+VNrVKrSrKi9qH4aj7PBrb6ocwG6u/UD421QtGhBzaU9UPLAPVL5U11m9Z/pqYG2OqHPgOo//bwQH9ZKo0w1Y9k6aF+cWNDhvpqSrMw1I/0W6H+m4N9DUP9yJebr5/SdCeu+vH8zihQ//X+nlpYX4dL2sjrxyYOQH0QZ/V1I9L6sYr7sPp7tUjroxAH+Pqaad6GXR+NuA/Ur1SrStj10YkDfH3dMEdh1Ecp7gP1qbzM6tP+IuujFgfu61d3JSrsiqqPXtyH1afyouonRhwQWT9R4j5j9Vl1qK/pBnsdhEDiqpYiZibDhiHgwCICrj5bCChupIPPLZA4PaWQ5WyOjRcrK95WHID01u4OWwTJ2xaEqeK6aZLnS0sTBxb8+lte/SDM3D0p9GKP/ZuznM16Wx6Y6XtSoP7/pMeZOfGgLMTnjcUtlgvmAkL+AkQMY9xQXMR6AAAAAElFTkSuQmCC'
image_path = r'图片'
layout = [
[sg.Image(data=i) for i in [ͼƬ1,ͼƬ2,ͼƬ3,ͼƬ4,ͼƬ5]]
]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
print(vaules)
if event == None:
break
window.close()
**UpdateAnimation动图更新方法**
`window[key].update_animation()`
`window[key].UpdateAnimation()`
gif 的圖片
import PySimpleGUI as sg
sg.theme('DarkTeal6')
base64_default = sg.DEFAULT_BASE64_LOADING_GIF
layout = [
[sg.Image(data=base64_default,key='-GIF-')]
]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read(timeout=10)
window['-GIF-'].update_animation(source=base64_default,time_between_frames=50)
print(vaules)
if event == None:
break
window.close()
图片切换案例:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
ͼƬ1 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAJ5SURBVGhD7dvLTttAFMbx4xCcWxEuoGxg0bJB6T0mBBa8CFLfo8/Q96jUF2FHYFUqxIJ2QRGNqm5QlSsxmcEHmRSDnWQ854zzR4hgImV+X7hkg/X5y1cPUtanj3tWxr+duu6ecXd3V14wuaP9ffkx1c/4DJ62jIRf9/v+rfCMgndabfh5egpnJyf+lfCMgCP4uNHw/jabAN7TL01Yw+/Ahz7YGr5FjCX8P/CQ3G234d/Vlfx6lFjBw8B/fl/K9163I+8XJRbwABgeAovbcSMNfwAskZOAMZJwlWCMFBzB3xWCMRLwUbD4K6wKjGmF6wBjWuC9bk8bGEsULsDnZz/g28GBNjCWCDwIbl78Gr6UHmgDY0rhCD5u0AFjSuCj4MGADhibKpwDGJsKnBMYmwjOEYyNBecMxmLBTQBjkeAmgbFH4SaCsVC4eEkZBHueJ69xB2Oh8KVyGV5sbMBcdr4lPrcsC5yVFVhYdCCTifWrgWSPCpzlZXi/s11Yr1SGA9gtAV5wHCivrrEfINLJbweoywGytt0xYYBYJxYDvKvXcyYMMNZJgwPM53JdjgNMdEIxwNutLVsMYOfzrAaYysnEAG9qNVYDTPVEwQFy+UKf8gBKTiIGeF3bzFIeQOkJKA+QyCPfG6BYvKYwQKKPKAdw3TkKA2j5XqMwgBY4FhygUCwNkhxAKxwTA1TcaibJAUjAsSQHIAXHggPkiyVPxQAk4ZgY4JVbtVQMQBqOBQcolJ5J8KQDsIBj8keg+gHCBrBiDMAKjoUNsPh8yb/H07GEY6MDxIk1HBtnACPgGA6wtv7SvxKeUXAsyrNuJDxKM3jamv2L5axUBHAD581flhCfpAwAAAAASUVORK5CYII='
ͼƬ2 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAJWSURBVGhD7dtPTxpBHMbx3+6yLK0NRg/YpCT1oodWPSCiJr4Rk76Pvoa+jyZ9I1xFT+XGhcR/COGAoPyVHXmaHtZhkN3ZmVm+CWGZcPk8LNywfv3+M6GE9fPHuWXPrhPXv0+8cHbGDkyuUi6z50R/4it40uLCR8Ph7Mq8uPB6rUa1apV6j53ZiTnNvdXbzSZVL6+MG0D4O27aAELwbqfDHjSZGDOAENz/kWs3H+ju+tqYAYRvdb/RcGDMAAvBkQkDvAuOdB5gKTjScYBQ4EinAUKFIx0GiASOVB4gUjhScQApcPT/AE/dR3YW1wBS4cgfoNVoUONmOkCvy85kDxALHA36fWrd38cyQKxwFMcASsCRzAGUgiMZAygJR1EOoDQcRTGAFnAU5gBawdG8AZ57T+yMl5ZwhAEebm9oPB6zM3+Av5ULuq3X2eu30hpuWRatZbO0kcuRbb9SHMd5/rqzQ1v5PHv9VlrCAc5Ncesbm+TYzhRs97d3d+ng5MTbnA7hv4eXVvAgcCrlzsCnaREw0gLOA+8flxYCI6XhgWDXHSwDRkrCg8CumxoycKnkLgNGSsF54L3ScSoMMFICHgj20qMowChWOBdcPHKiAKNY4HGCkVR4EDjtpccywUgKnAf+XjyyZYJRpHAVwSgSeDDYm6gARqHC+eCipQIYhQLXCYyWggeBvYzaYPQuOA/87VBtMFoIHgj+kCGdwEgIbtkccOGQdAIjIfin7LoxYCR8q5sCRnPhpoERF/75S944MOLCM2sfjQMj4e+4aa3gSWv1F8tViYjoBXy8SJbXZKzgAAAAAElFTkSuQmCC'
ͼƬ3 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAJpSURBVGhD7ZrdbtMwFIBPmp+mbZKuVVRQQaK9YOOCaRPSuNqLIPEePAPvgcSL7G4SN0OCDRATKmJsYe20dc3apsF2TOm6UuKqtHjHn3RUx85FvxzHcY6ivXz1OgZkvHj+TMvwNjqGGX+yvc06bjNvdnbYL+qMK3FsKHFsKHFsKHFsKHFsKHFsKHFsTBU/ajTgw97etTg9PuajcjO1EHF4cHBDNGMYYOg6P1oc9+p1KPk+P5oN4ULE5cUFhGGHtQf9PnSvrhYen9+9j5tBwP7DPEiV8fNWCzqXbcgsIdMUx3XBzhdA0zR4tLkBuYLDRxLoBTnc34c4TuqmbrEID9fXWXuUmUpP/V4PumG4lDglYr1el4k1TwI4PzsbRnD07Zp0WuRY1YlUHA1Yc3zB/fLxE5MOyYxs/Uh/K0jzOIuiCCKyvkyKTrvNZoUI0og3gxP4/rUxMegYnRUiCIkXS2WoPqixsGyb98pJKnF3ZYXJFjyP98iP8FSnj5TbwFTx2uoqe76PhmlZfFRupFnc5o0Sx4YS/9+hiyrdO4yHbpj8DDGkEaebJ//O3RtRqVbZm5so0k11wzTBymZZmJbJ9hVl3xeWl078fr0Oj7e2eDxNqjJEnvzGjlfkZ/0dqRc3mu3a2hqTJ22Nzoa0CH/883Z3l5WCaClq0I94778nm8+BntHZbrJcqfDehKRAQd7QOPQCeKUSP/rNXD7+se0c5B1nYUGl/wS7z8nF+BWTpMcRzjitb8WDpBqyDAquB9ncbK/EoxlX37lhQ4ljQ4ljQ4ljQ4ljQ4ljQ4ljQ4ljA634sBCBCdSFCKQA/ASBZ6zjcvksuwAAAABJRU5ErkJggg=='
ͼƬ4 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAMwSURBVGhD7ZvdThpBGEC/5R8LggJWe9XWRMVqL/ypN75Ik75Hn6Hv0aQv4rU2etHGprVJRVu1RQoiUGE733SGTlaERXZnvwVOMsHdTIxnzs4KxjXevH1nwojx+tVLIyC+Hjnaxde2t/mJYWZ3Z4e/jnTxsfio0VW8Wq6AaQ7nTb+r+NnpCRzu70PtuirO0KFwdARfDw87ju/Hx2LW3fS81K/KZfiwu2f+KBRI1S9eXMCvs7OOo1wsill3Y2uPM2EDV5hi/WqlAuXLSz76+dlsiTdqdWi1WqL+e6BUv3rFxEtMnI1a1WHxeu0azk8KfEVNs8X3F9W9bxdb4kiz2eT75/Lnxf/6e7Tq94NtcQnuqXZ9tgB+rd+3ODIM9e8lLvFz/YHEkU71P/qg/sDiErU+LgD1+o6JI36q76i4xA/1XRFHqNd3TVxCtb7r4oilvinrn5+cihn60SIuEfUNWf/bl8/w6eAAGvW6mKEPreKItX65VGKf+Ha119cuLlHr42Loru+ZOOJlfU/FJV7UJyGO6K5PRlyiqz45cUTWr/wu8WNZH//O7xQkxcEwIJlKQyI5KQ6NxuPFRZhIJvixE5ATD0cikJudg2Q6zRcglck0nm9tRVLT02KGM9ARF5VRGuUDgeCf+eVlmM/nI8FQSExyDhLi1srpTOZm9cVm2OnKKt6KWysH/1V+ms+H3Kis4pm4tfJ0Ltda3XS3sop+cUtlVvYGK7O7dsDtyipaxTtVXtnYCOmqrKJH/FblcNOLyiqui9+qPDMDKxvrQS8qq7gmzt5tweTUVLtyKBxu8coLC7ivxSzvcEU8Eo1Cbu4RJCZT7crP1tcDXldWcVRcVs4+nMXCWJpUZRXHxDtVXl5bI1VZZWBxa2U2TKqVVQYSt1aeymZxLxtUK6vcS9xaGcs+WVrig3Jllb7F76jMX/2EbfFulfHYb9gSD0fZu68hqKxiSzwWn5B3bHKVY/E4TCQSfESiMXG2N7YvdazLfi+Tq4xXYTqT5QPl7dJTnGJlJJFMsk98qY4j/qD3AnR9JgX/Qxi/ESXhQbD9TApe1sMibcX2Hh82xuKjxvgRyzEjAcBfnIZW0hne4u4AAAAASUVORK5CYII='
ͼƬ5 = b'iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAMTSURBVGhD7Ztra9pQGIBPksVcdOtFLVNcKfVL6y6t9oIf+kcG+x/7Dfsfg/2RftV+moPSwmAfJh2Tts5qEmt23tOkPZNpUzhJ3qgPHNQoeJ7zmAtIpE+fv7hkzvj44b0ke8/njvvitaMjtmGWaR4fs8e5Lr4QnzdmUnzQv/GeTWaq+O92m3w/PZ04sHE7HLJ5/Tg797ZMZqp49/qadC4uJg5MXHU65GujMQo6r0A/dXswIN3LSzZ6dDEw4Vc+b7XI0HEC77qBPmiB+BUVp+NPF484VG41m3eVXZcGsrx3HifwCmGCr+zYtkwH+dX+SW56Xe8Tj5M4cW9fdv3KsPuBNMg/hcSIj+3Lkl8Zdj9YgKeSCHFRlXlQi4uuzINWnB2xG02hlXnQif9zxHZsoZV5UIl75+W7q8IQKvOgEB87L7MRRmWe2MWjrMwTm3gclXliEY+rMk+k4nFX5olMHCp/OzmJtTJP6OJ8ZduyYq3ME6o4tso8oYhjrcwjXBxzZR5h4kmozCNE3LGdh8oUq99HWZlHiLiaUkm5sk0URenBa80wyGouR2QllEOIEITNzEhnyLt6PZ0vFC2XoptpslYoEXjEiNAkkiSRV+VNrVKrSrKi9qH4aj7PBrb6ocwG6u/UD421QtGhBzaU9UPLAPVL5U11m9Z/pqYG2OqHPgOo//bwQH9ZKo0w1Y9k6aF+cWNDhvpqSrMw1I/0W6H+m4N9DUP9yJebr5/SdCeu+vH8zihQ//X+nlpYX4dL2sjrxyYOQH0QZ/V1I9L6sYr7sPp7tUjroxAH+Pqaad6GXR+NuA/Ur1SrStj10YkDfH3dMEdh1Ecp7gP1qbzM6tP+IuujFgfu61d3JSrsiqqPXtyH1afyouonRhwQWT9R4j5j9Vl1qK/pBnsdhEDiqpYiZibDhiHgwCICrj5bCChupIPPLZA4PaWQ5WyOjRcrK95WHID01u4OWwTJ2xaEqeK6aZLnS0sTBxb8+lte/SDM3D0p9GKP/ZuznM16Wx6Y6XtSoP7/pMeZOfGgLMTnjcUtlgvmAkL+AkQMY9xQXMR6AAAAAElFTkSuQmCC'
image_path = r'图片'
data_list = [ͼƬ1,ͼƬ2,ͼƬ3,ͼƬ4,ͼƬ5]
layout = [
[sg.Image(data=ͼƬ1,
background_color='black',
# 背景颜色设定
size=(112, 111),
# 图片 宽度和高度设定(pix)
pad=None,
# 和周围元素间的间隔 ((int,int),(int,int))
# 左右上下顺序
key='-IMAGE-',
# 元素的唯一标识符
tooltip='SHUJU+',
# 元素的悬浮文本
right_click_menu=['开始',['图片切换','退出界面']],
# 右击调出菜单 ['开始',['开始','中止','结束']]
visible=True,
# 元素可见状态 bool
enable_events=True,
# 元素事件属性,默认为False
)]]
window = sg.Window('python gui',layout,keep_on_top=True)
i = 0
while True:
event,vaules = window.read()
print(vaules)
if event == None:
break
if event == '图片切换':
window['-IMAGE-'].update(data=data_list[i])
i = i + 1 if i < 9 else 0
if event == '退出界面':
window.close()
window.close()
3.1 列元素介绍
一个容器元素,用于在窗口的布局中创建布局
`sg.Column()`or`sg.Col()`
```
Column(
layout,
# 将在“列”容器中显示的布局 [[sg.T('hello world')]]
background_color=None,
# 整栏背景色
size=(None, None),
# (宽度,高度)以像素为单位的尺寸(
# 偶尔不工作。
pad=None,
# 与周围元素间的间隔设定 左右上下
scrollable=False,
# 如果为True,则滚动条将添加到该列
vertical_scroll_only=False,
# 如果为True,则不会显示水平滚动条
right_click_menu=None,
# 右击调出菜单
key=None,
# 元素的唯一标识符
visible=True,
# 元素的可见状态设定
justification="left",
# 为列本身设置对齐方式
element_justification="left",
# 列内所有元素的对齐方式
# 有效值为 left,center,right
vertical_alignment=None,
# 垂直对齐方式
# 有效值为top,bottom,center
grab=None,
# 如果设定为True,可以拖拽此元素移动窗口
expand_x=None,
# 如果为True,则列将自动沿X方向扩展以填充可用空间
expand_y=None,
# 如果为True,则列将自动沿y方向扩展以填充可用空间
)
```
练习:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
col_layout = [[sg.Text('姓名')]] + [[sg.In(size=(10,1))]]
# + \ # [[sg.Text('性別')]] + [[sg.Input(size=(10,1))]]
layout = [[sg.Col(col_layout,
background_color='green',
# size=(100,200),
# scrollable=True,
# vertical_scroll_only=True,
element_justification="center",
expand_x=True,
expand_y=True,
grab=True,
),sg.LBox(list(range(1,10)),size = (10,6))]]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
if event == None:
break
window.close()
3.2 框架元素
容器元素,可以存放其他元素。 四周有线条围绕和一个文本元素作为标题
`sg.Frame()`
```python
Frame(
title,
# 标题文本
# str
layout,
# 容器内元素布局
# [[sg.In()]]
title_color=None,
# 标题文本颜色设定
background_color=None,
# 框架元素背景颜色
title_location=None,
# 标题所处位置
# 有效值有12种(ewsn 东西南北)
# e,es,en,s,se,sw,w,ws,wn,n,ne,nw
# 默认为nw
relief="groove",
# 浮雕设计 和其他元素的有效值是一样的。
# raised,sunken,flat,groove,ridge,solid
size=(None, None),
# 元素的宽度和行高
# 偶尔不起作用
font=None,
# 可以设置字体名称,大小等等
pad=None,
# 和周围元素间隔的设定((left, right), (top, bottom))
border_width=None,
# 框架元素的线条宽度
key=None,
# 框架元素的唯一标识符
tooltip=None,
# 悬浮文本
right_click_menu=None,
# 右击调出菜单
visible=True,
# 元素可见状态设定
element_justification="left",
# 框架内元素的对齐方式
# 有效值 left,right,center
vertical_alignment=None,
# 垂直对齐方式
# top bottom center
# 支持首字母简写
)
```
标题位置的方位显示
例子:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
fra_layout = [[sg.Text('姓名')]] + [[sg.In()]]+\
[[sg.Text('性別')]] + [[sg.Input()]]+ \
[[sg.Text('國籍')]] + [[sg.Input()]]
layout = [[sg.Frame(title='基本信息栏目',
layout=fra_layout,
title_location='nw' ,
background_color = 'blue',
title_color='white',
relief="groove",
right_click_menu=['开始',['开始','結束']],
)] ]
window = sg.Window('python gui',layout,keep_on_top=True)
while True:
event,vaules = window.read()
if event == None:
break
window.close()
案例 2:
import PySimpleGUI as sg
sg.theme('DarkTeal6')
fra1_layout =[
[sg.Text('姓名'),sg.Input()],
[sg.Text('性別'), sg.Input()],
[sg.Text('國籍'),sg.Input()],
]
fra2_layout = [[sg.Listbox(list(range(12)),size=(20,6))]]
layout = [[sg.Button('界面切换1',key='-ui1-')],
[sg.Frame(title='基本信息栏目',key='-fra1-',layout=fra1_layout,title_location='nw'),
sg.Frame('listbox', layout=fra2_layout,visible=False,key='-fra2-')] ]
window = sg.Window('python gui',layout,keep_on_top=True)
result = True
while True:
event,vaules = window.read()
if event == None:
break
if event == '-ui1-':
window['-fra2-'].update(visible=result)
window['-fra1-'].update(visible=not result)
result = not result
window.close()
import PySimpleGUI as sg
sg.theme('DarkTeal6')
fra1_layout =[
[sg.Text('姓名'),sg.Input()],
[sg.Text('性別'), sg.Input()],
[sg.Text('國籍'),sg.Input()],
]
fra2_layout = [[sg.Listbox(list(range(12)),size=(20,6))]]
col_layout=[[sg.Frame('基本信息栏目',fra1_layout,key='-fra1-')],[sg.Button(i) for i in ['提交','更新']]]
layout = [[sg.Button('界面切换1')],
[sg.Col(col_layout,key='-col1-'),
sg.Frame('listbox', layout=fra2_layout,visible=False,key='-fra2-')]]
window = sg.Window('python gui',layout,keep_on_top=True)
result = True
while True:
event,vaules = window.read()
if event == None:
break
if event == '界面切换1':
window['-fra2-'].update(visible=result)
window['-col1-'].update(visible=not result)
result = not result
window.close()
3.3标签元素 Tab & TabGroup
```
sg.TabGroup(
[[sg.Tab('Tab1',tab1_layout,),sg.Tab('Tab2',tab2_layout)]],
)
```
注意事项:(1.TabGroup(layout), 2.Tab1和Tab2要写在一行里面。)
```python
Tab(
title,
# str
# 标签上显示的文本
layout,
# 标签内包含的布局
background_color=None,
# 标签的背景颜色设定
font=None,
# 字体名称,大小设定
pad=None,
# 周围元素的间隔设定
disabled=False,
# 禁用状态设定
border_width=None,
# 边界线宽度设定
key=None,
# 元素的唯一标识符
tooltip=None,
# 悬浮文本设定
right_click_menu=None,
# 右击调出菜单
visible=True,
# 元素可见状态设定
element_justification="left",
# 容器内元素的对齐方式
# 有效值 left,right,center
)
```
案例:
import PySimpleGUI as sg
tab1_layout=[
[sg.Text('姓名',size=(8,1)),sg.In()],
[sg.Text('性别',size=(8,1)),sg.In()],
[sg.Text('国籍',size=(8,1)),sg.In()]]
col_layout=[
[sg.Text('姓名',size=(3,1)),sg.In(size=(3,1))],
[sg.Text('性别',size=(3,1)),sg.In(size=(3,1))],
[sg.Text('国籍',size=(3,1)),sg.In(size=(3,1))]]
tab2_layout=[[sg.LB(list(range(15)),size=(20,6)),
sg.TabGroup([[sg.Tab('1',[[sg.CB(i)]for i in range(2)]),
sg.Tab('2',[[sg.Combo(list(range(15)),size=(10,3))]])]]),
sg.Col(col_layout)],[
sg.Frame('slider',[[sg.Slider(orientation='h',size=(50,10))]])]]
layout=[[sg.TabGroup([[ sg.Tab('tab1',tab1_layout,title_color='blue',),sg.Tab('tab2',tab2_layout) ]])]]
window=sg.Window('Python GUI',layout,keep_on_top=True)
result=True
while True:
event,values=window.read()
print(event)
if event==None:
break
window.close()
4.1 颜色选择器
`sg.ColorChooserButton()`
将16进制颜色码(hex)赋值给目标元素
```python
ColorChooserButton(
button_text,
# 按钮元素要显示的文本
target=key,
# 显示颜色码的目标元素的key
------------------------
image_filename=None,
image_data=None,
image_size=(None, None),
image_subsample=None,
tooltip=None,
border_width=None,
size=(None, None),
auto_size_button=None,
button_color=None,
disabled=False,
font=None,
bind_return_key=False,
# 绑定回车键
# 按一下回车键,调出颜色选择界面。
focus=False,
pad=None,
key=None,
)
```
练习:
import PySimpleGUI as sg
layout=[[sg.ColorChooserButton('颜色选择器',target='-color-',key='-CCB-',bind_return_key=True)],
[sg.InputText(key='-color-',enable_events=True)]]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
print(event)
if event==None:
break
if event == '-color-':
window['-CCB-'].update(button_color=('white',values['-color-']))
window.close()
4.2文件选择器
`sg.FileBrowse()`
点击按钮选择文件后,可以获得文件的绝对路径。
```python
FileBrowse(
button_text="Browse",
# 按钮元素上要显示的文本
target=key,
# 显示路径的目标元素的key
file_types=(('ALL Files', '*.*'),),
# 只显示指定的文件类型 '*.pdf'
# 只显示指定的文件名称 'text.*'
initial_folder=None,
# 默认路径设定
-----------------------------
tooltip=None,
size=(None, None),
auto_size_button=None,
button_color=None,
enable_events=False,
font=None,
disabled=False,
pad=None,
key=None,
)
```
案例:
import PySimpleGUI as sg
layout=[[sg.FileBrowse(target='-IN-',file_types=(('ALL Files', '*.*'),), initial_folder=r'C:\Users\86181\Desktop\test\image1')],[sg.Input(key='-IN-')]]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
print(event)
if event==None:
break
window.close()
4.3文件另存为&文件夹选择器
文件另存为
`sg.FileSaveAs()`
注意: 文件名重复时系统会提醒文件名重复。
```
FileSaveAs(
button_text="Save As...",
target=key,
file_types=(('ALL Files', '*.*'),),
initial_folder=None,
disabled=False,
tooltip=None,
size=(None, None),
auto_size_button=None,
button_color=None,
enable_events=False,
font=None,
pad=None,
key=None,
)
```
文件夹选择器
`sg.FolderBrowse()`
```
FolderBrowse(
button_text="Browse",
target=key,
initial_folder=None,
tooltip=None,
size=(None, None),
auto_size_button=None,
button_color=None,
disabled=False,
enable_events=False,
font=None,
pad=None,
key=None,
)
```
import PySimpleGUI as sg
layout=[[sg.Input(),sg.FileSaveAs()]]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
print(event)
if event==None:
break
window.close()
如果不设定target,
路径默认显示到为选择器同行且左边的第一个输入框。
[[sg.In(),sg.FileSaveAs()]]
左边没有输入框,默认显示到最右边的单行显示/输入框里。
[[sg.FileSaveAs(),sg.In(),sg.In(),]]
4.4 日历选择器
``python
CalendarButton(
button_text,
# 按钮上显示的文本
target=(key),
# 选择的日期要显示的位置
close_when_date_chosen=True,
# 选择日期后 日历界面关闭
default_date_m_d_y=(None, None, None),
# 默认值设定
locale=None,
format="%Y-%m-%d %H:%M:%S",
begin_at_sunday_plus=0,
month_names=None,
day_abbreviations=None,
title="Choose Date",
no_titlebar=True,
location=(None, None),
-------------------------------------
image_filename=None,
image_data=None,
image_size=(None, None),
image_subsample=None,
tooltip=None,
border_width=None,
size=(None, None),
auto_size_button=None,
button_color=None,
disabled=False,
font=None,
bind_return_key=False,
focus=False,
pad=None,
enable_events=None,
key=None,
)
```
##
例子:
import PySimpleGUI as sg
month = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']
week = ['周日','周一','周二','周三','周四','周五','周六']
layout=[[sg.In(),sg.CalendarButton(button_text='日历选择',
close_when_date_chosen=False,
# 选择日期后 日历界面关闭
default_date_m_d_y=(1, 10, 1994),
# 默认值设定
locale=None,
format="%Y-%m-%d %H:%M:%S",
begin_at_sunday_plus=0,
month_names=None,
day_abbreviations=None,
title="Choose Date",
no_titlebar=True,
location=(None, None),
)]]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
print(event)
if event==None:
break
window.close()
4.5 预设按钮介绍
例子:
import PySimpleGUI as sg
def CA(button_text,color_text):
return [sg.Button(button_text,size=(15,1),
font=('黑体',12),button_color=(color_text,'blue'))]
layout=[CA('確定',color_text='yellow'),
CA('提交',color_text='white'),
CA('取消按钮',color_text='red'),
]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
print(event)
if event==None:
break
window.close()
5.1 预设弹窗介绍
**弹窗的作用**
弹窗可以包含内容是个可变参数。
等效于print语句,暂停程序的运行,让用户读取一些错误信息
Popup弹窗介绍
`sg.popup()`or`sg.Popup()`
```python
Popup(
args=*<1 or N object>,
# 可变参数
title=None,
# 弹窗标题,如果未设定,则默认显示可变参数的第一个文本作为标题。
button_color=None,
# (文本颜色,背景颜色)
background_color=None,
# 弹窗的背景颜色
text_color=None,
# 弹窗上面的文本颜色
auto_close=False,
# 如果设定为True,弹窗会自动关闭界面
auto_close_duration=None,
# 自动关闭窗口之前界面持续的时间(以秒为单位)
custom_text=(None, None),
# 自定义按钮上要显示的文本。可以设定一个或者两个
non_blocking=False,
# 非阻塞设定。如果为True,立即执行下一步。不需要等待用户的输入。
font=None,
# 字体大小,名称设定
no_titlebar=False,
# 不显示标题栏。
grab_anywhere=False,
# 如果为True,拖动界面进行移动。
keep_on_top=False,
# 如果为True,保持界面在屏幕的最前方
location=(None, None),
# 界面出现的位置
any_key_closes=False,
# 如果为True,敲打任意键盘就会关闭界面.
# 如果为False,只用X窗口关闭按钮,用户选择,以及回车键才会关闭窗口。
image=None,
# 显示图片(支持base64)
modal=True
# 模态窗口设定。
# 除非关闭此窗口否则其他界面不能进行操作。
)
```
例子:
import PySimpleGUI as sg
layout=[[sg.OK()]]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
print(event)
if event == None:
break
if event == 'OK':
sg.popup('tets'*50,location=(0,0),modal=False)
window.close()
5.2 弹窗介绍PopupGetText
弹窗特征:
显示带有文本输入字段的弹出窗口。
返回输入的文本,如果关闭/取消则返回None。
`sg.PopupGetText()`or
`sg.popup_get_text()`
```python
PopupGetText(
message,
# 显示的文本
title=None,
# 标题设定
default_text="",
# 输入框内默认文本设定
password_char="",
# 密码字符 一般设定为*
size=(None, None),
# 单行输入框的宽度和行高设定
button_color=None,
# 按钮元素的(文本颜色,背景颜色)设定
background_color=None,
# 界面背景颜色设定
text_color=None,
# 文本颜色设定
font=None,
# 字体名称和大小设定
no_titlebar=False,
# 无标题栏设定
grab_anywhere=False,
# 移动窗口设定
keep_on_top=False,
# 保持该弹窗在界面的最前方
location=(None, None),
# 窗口出现的位置设定
image=None,
# 图片上传
modal=True
#模态界面设定。如果为True,其他界面无法操作。
)
```
例子:
import PySimpleGUI as sg
pw = '123'
for i in range(5):
result = sg.PopupGetText('请输入密码!')
if result == pw:
sg.popup('密码正确,开始登录!')
break
else:
sg.popup('密码错误请重新输入!')
layout=[[sg.Input()]for i in range(5)]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
print(event)
if event == None:
break
window.close()
5.3 弹窗介绍PopupGetFile
弹窗特征:
显示带有文本输入字段和浏览(browse)按钮的弹出窗口,以便用户可以选择文件。
PopupGetFile(
message,
# 文本设定
title=None,
# 窗口标题设定
default_path="",
# 默认文件路径
save_as=False,
# 如果设定为True,打开按钮变成的另存为按钮,显示Save As...
multiple_files=False,
# 如果为True,可以多选。
file_types=(('ALL Files', '*.*'),),
# 设定可选文件类型。默认所有。
no_window=False,
# 直接打开文件资源管理器,不显示弹窗界面。
size=(None, None),
# 单行输入框的宽度行高的设定
button_color=None,
# 按钮元素(文本颜色,背景颜色)的设定
background_color=None,
# 整个界面的背景颜色的设定
text_color=None,
# 文本字体颜色的设定
font=None,
# 字体名称,大小设定
no_titlebar=False,
# 如果为True,不显示标题栏。
grab_anywhere=False,
# 如果为True,可以拖拽界面
keep_on_top=False,
# 如果为True,窗口保持在界面的最前方。
location=(None, None),
# 界面运行出现的初始位置)
initial_folder=None,
# 打开咨询管理器时默认的文件夹
image=None,
# 图片上传
modal=True
# 模态窗口)
5.4 弹窗介绍PopupGetFolder
弹窗特征:
显示带有文本输入字段和浏览按钮的弹出窗口,以便可以选择文件夹。
`sg.PopupGetFolder()`or
`sg.popup_get_folder()`
```python
PopupGetFolder(
message,
title=None,
default_path="",
no_window=False,
size=(None, None),
button_color=None,
background_color=None,
text_color=None,
font=None,
no_titlebar=False,
grab_anywhere=False,
keep_on_top=False,
location=(None, None),
initial_folder=None,
image=None,
modal=True)
```
5.5 弹窗介绍PopupAnnoying
弹窗特征:
没有标题栏,可以随意移动窗口。
```python
PopupAnnoying(
args=*<1 or N object>,
title=None,
button_color=None,
background_color=None,
text_color=None,
auto_close=False,
auto_close_duration=None,
non_blocking=False,
font=None,
grab_anywhere=True,
keep_on_top=False,
location=(None, None),
image=None,
modal=True)
```
5.6 弹窗介绍PopupAutoClose
弹窗特征:
显示一段时间后自动关闭窗口。
```python
PopupAutoClose(
args=*<1 or N object>,
title=None,
button_color=None,
background_color=None,
text_color=None,
auto_close=True,
auto_close_duration=None,
non_blocking=False,
font=None,
no_titlebar=False,
grab_anywhere=False,
keep_on_top=False,
location=(None, None),
image=None,
modal=True)
```
5.7 弹窗介绍PopupCancel
弹窗特征:
含有一个Cancelled的按钮。
```python
PopupCancel(args=*<1 or N object>,
title=None,
button_color=None,
background_color=None,
text_color=None,
auto_close=False,
auto_close_duration=None,
non_blocking=False,
font=None,
no_titlebar=False,
grab_anywhere=False,
keep_on_top=False,
location=(None, None),
image=None,
modal=True)
```
5.8 弹窗介绍PopupOKCancel
弹窗特征:
弹窗含有OK和Cancel两个按钮。
```python
PopupOKCancel(args=*<1 or N object>,
title=None,
button_color=None,
background_color=None,
text_color=None,
auto_close=False,
auto_close_duration=None,
non_blocking=False,
icon=...,
line_width=None,
font=None,
no_titlebar=False,
grab_anywhere=False,
keep_on_top=False,
location=(None, None),
image=None,
modal=True)
```
5.9 弹窗介绍PopupError
弹窗特征:
含有一个带有颜色的Error按钮
```python
PopupError(args=*<1 or N object>,
title=None,
button_color=(None, None),
background_color=None,
text_color=None,
auto_close=False,
auto_close_duration=None,
non_blocking=False,
line_width=None,
font=None,
no_titlebar=False,
grab_anywhere=False,
keep_on_top=False,
location=(None, None),
image=None,
modal=True)
```
5.10 弹窗介绍PopupNoButtons
弹窗特征:
显示无按钮的弹窗。
```python
PopupNoButtons(args=*<1 or N object>,
title=None,
background_color=None,
text_color=None,
auto_close=False,
auto_close_duration=None,
non_blocking=False,
line_width=None,
font=None,
no_titlebar=False,
grab_anywhere=False,
keep_on_top=False,
location=(None, None),
image=None,
modal=True)
```
5.11 弹窗介绍PopupNoWait
弹窗特征:
显示弹出窗口并立即返回
```python
PopupNoWait(args=*<1 or N object>,
title=None,
button_color=None,
background_color=None,
text_color=None,
auto_close=False,
auto_close_duration=None,
non_blocking=True,
line_width=None,
font=None,
no_titlebar=False,
grab_anywhere=False,
keep_on_top=False,
location=(None, None),
image=None,
modal=False)
```
6.1 菜单栏 Menu
Menu(
menu_definition,
# 菜单栏定义
tearoff=False,
# 独立菜单设定
font=None,
# 字体名称大小设定
pad=None,
# 周围元素间隔设定
key=None,
# 唯一标识符设定
)
```
**关于menu_definition示例**
```
menu_def = [['&File', ['!&New File', '&Open File::openkey', '---', 'Open Fol&der', 'E&xit']],
['!&Edit', ['!&Paste', ['Cut', 'Repeat', ], 'Undo'], ],
['&Find', ['Find...', 'Replace']],
['&Tools', ['Command &1', 'Command &2', 'Command &3', 'Command &4']],
['&Help', '&About...'], ]
```
**重点**
'---' 菜单栏分割线设定
& 快捷键标注 Alt+key(避免重复)
! 菜单栏禁用设定
:: 菜单key设定。作为事件的一部分。
import PySimpleGUI as sg
menu_def = [['&File', ['!&New File', '&Open File::openkey', '---', 'Open Fol&der', 'E&xit']],
['!&Edit', ['!&Paste', ['Cut', 'Repeat', ], 'Undo'], ],
['F&ind', ['Find...', 'Replace']],
['&Tools', ['Command &1', 'Command &2', 'Command &3', 'Command &4']],
['&Help', '&About...'], ]
layout=[[sg.Menu(menu_def,
key='UU')]]+[[sg.In(key=i)]for i in range(5)]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
print(event)
if event==None:
break
window.close()
效果图:
6.2 window窗口常用属性
Window(
title,
# 窗口标题设定
layout=None,
# 布局设定
location=(None, None),
# 默认窗口出现的位置
size=(None, None),
# 窗口宽高设定
element_padding=None,
# 元素间间隔设定
button_color=None,
# 按钮元素颜色设定(文本颜色,背景颜色)
font=None,
#(字体名称,字体大小)
background_color=None,
# 背景颜色设定
auto_close=False,
# 界面自动关闭设定
auto_close_duration=3,
# 默认为3秒,自动关闭前界面持续打开时间
no_titlebar=False,
# 界面无标题栏设定
grab_anywhere=False,
# 拖拽窗口设定。
keep_on_top=False,
# 如果为True,界面保持在屏幕的最前方
resizable=False,
# 如果为True,界面生成后可以调整大小
disable_close=False,
# 如果为True,窗口关闭按钮将不起作用
disable_minimize=False,
# 如果为True,窗口最小化按钮将不起作用
right_click_menu=None,
# 右击调出菜单
transparent_color=None,
# 界面透明设定 =sg.theme_background_color()
element_justification="left",
# 元素对齐方式设定。有效值 left,right,center
)
```
6.3 Multiline多行文本框
Multiline(
default_text="",
# 默认显示的文本
disabled=False,
# 元素禁用状态设定
border_width=None,
# 边界线条宽度设定
size=(None, None),
# 宽度和行高设定
background_color=None,
# 背景颜色设定
text_color=None,
# 文本颜色设定
enable_events=False,
# 元素事件属性
key=None,
# 元素的唯一标识符
write_only=False,
# 设定为True时,文本框只提供用户写入,窗口不读取。无返回值。
reroute_stdout=False,
# print语句内容会显示在此文本框内
reroute_cprint=False,
# 使用cprint将内容打印到此文本框内。详细参考sg.cprint()
reroute_stderr=False,
# 捕捉异常时将文本写在此元素内. sys.stderr.write('?')
autoscroll=False,
# 如果为True,更多数据添加到末尾时元素的内容将自动滚动
focus=False,
# 焦点设置
font=None,
# 字体名称和大小设定
pad=None,
# 和周围元素间间隔的设定
tooltip=None,
# 悬浮文本设定
justification=None,
# 对齐方式设定
right_click_menu=None,
# 右击调出菜单设定
visible=True,
# 元素可见状态设定。
do_not_clear=True,
# 默认为True,如果设定为False,窗口读取一次,内容就会自动清除。
)
```
案例:
import PySimpleGUI as sg
layout=[[sg.Multiline(
disabled=False,
# 元素禁用状态设定
border_width=None,
# 边界线条宽度设定
size=(50, 10),
# 宽度和行高设定
background_color='gray',
# 背景颜色设定
text_color='red',
# 文本颜色设定
enable_events=True,
# 元素事件属性
key='-key-',
# 元素的唯一标识符
write_only=False,
# 设定为True时,文本框只提供用户写入,窗口不读取。无返回值。
reroute_stdout=True,
# print语句内容会显示在此文本框内
reroute_cprint=False,
# 使用cprint将内容打印到此文本框内。详细参考sg.cprint()
reroute_stderr=False,
# 捕捉异常时将文本写在此元素内. sys.stderr.write('?')
autoscroll=False,
# 如果为True,更多数据添加到末尾时元素的内容将自动滚动
focus=False,
# 焦点设置
font=None,
# 字体名称和大小设定
pad=None,
# 和周围元素间间隔的设定
tooltip=None,
# 悬浮文本设定
justification=None,
# 对齐方式设定
right_click_menu=None,
# 右击调出菜单设定
visible=True,
# 元素可见状态设定。
do_not_clear=True,)]]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
print(values)
if event==None:
break
window.close()
6.4 cprint方法
cprint(
args=*<1 or N object>,
# 可变参数,
end=None,
# 结束符 默认为回车键
sep=" ",
# 分隔符 默认为空格键
text_color=None,
# 可以简写成t
background_color=None,
# 可以简写成b
colors=None,
# 可以简写成c
key=None,
#元素的唯一标识符
justification=None
#文本对齐方式)
案例:
import PySimpleGUI as sg
layout=[[sg.Multiline(
default_text="hello",
disabled=False,
size=(50, 10),
enable_events=True,
# 元素事件属性
key='-key-',
# 元素的唯一标识符
write_only=False,
# 设定为True时,文本框只提供用户写入,窗口不读取。无返回值。
reroute_stdout=True,
# print语句内容会显示在此文本框内
reroute_cprint=True)]]+[[sg.OK()]]+[[sg.Cancel()]]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
if event==None:
break
if event == 'OK':
print('OK')
if event == 'Cancel':
sg.cprint('Cancel','--FROM CANCEL BUTTON',
end=';',
sep='+',
colors='blue',
justification='l')
window.close()
**update方法**
```python
Update(
value=None,
# 更新内容
disabled=None,
# 元素禁用
append=False,
# 如果设定为True,要更新的内容会接在原来文本的下方。原来的文本不会消失。
font=None,
# 字体大小名称设定
text_color=None,
# 文本颜色设定
background_color=None,
# 背景颜色设定
text_color_for_value=None,
# 更新的文本的字体颜色设定
background_color_for_value=None,
# 更新的文本的背景颜色设定
visible=None,
# 元素可见状态更新。默认可见
autoscroll=None,
# 更新文本是否自动滚动。默认不自动滚动
justification=None
# 更新文本对齐方式)
```
6.5 print方法
`window[key].print()`
```python
print(
args=*<1 or N object>,
# 可变参数
end=None,
# 要打印的元素的结束符 默认为换行 end='\n'
sep=None,
# 要打印的元素的分隔符 默认为空格 sep=' '
text_color=None,
# 要打印的元素文本颜色
background_color=None,
# 要打印的元素这一行的背景颜色
justification=None
# 要打印的元素对齐方式
)
```
6.6 垂直分割线
sg.VerticalSeparator(
color=None,
key=None,
pad=None
)
```
案例:
import PySimpleGUI as sg
layout=[[sg.Multiline(
default_text="hello",
disabled=False,
size=(50, 10),
enable_events=True,
# 元素事件属性
key='-key-',
# 元素的唯一标识符
write_only=False,
# 设定为True时,文本框只提供用户写入,窗口不读取。无返回值。
reroute_stdout=True,
# print语句内容会显示在此文本框内
reroute_cprint=True,
autoscroll=True,
do_not_clear=True,
)]]+[[sg.OK(),sg.VerticalSeparator(color='yellow',key=None,pad=None),sg.Cancel()]]
window=sg.Window('Python GUI',layout,keep_on_top=True)
while True:
event,values=window.read()
if event==None:
break
if event == 'OK':
window['-key-'].print('123',
justification='r',
text_color='red',
background_color='gray')
if event == 'Cancel':
window['-key-'].print('456',
justification='l',
text_color='blue',
background_color='yellow')
window.close()
这套笔记断断续续整理了一个多月了,人比较懒,那就先记录这了,欢迎各位大佬指点。