PySimpleGUI - 列不会更新
PySimpleGUI - Column won't update
尝试使用 PySimpleGUI 构建一个简单的 window。我想要一个包含列表中存储的视频信息的行列表。这是我的代码:
layout = [
[sg.Text("Clique para iniciar:")],
*[[sg.Button(k)] for k in botoes],
# [sg.Column([[sg.Text('Passos')]], key = 'CONTAINER_STATUS')],
[sg.Text('Índice Vídeo Selecionado:'), sg.In(key=0), sg.In(key=1, enable_events=True)],
# [sg.Text('Status Vídeos: ')],
[sg.Text('Vídeo'), sg.Text('Status Vídeo'), sg.Text('Status Thumbnail')],
[sg.Column([[sg.Text('test'), sg.Text('test2')],[sg.Text('test3'),sg.Text('test4')]], key='CONTAINER_VIDEOS', size= (50, 50))],
]
window = sg.Window("Iniciar Processamento de Vídeo", layout)
def get_layout_video(video):
status = video.status.name if video.status is not None else ''
status_thumb = video.thumbnail.status.name if video.thumbnail.status is not None else ''
try:
layout = [
sg.Text(video.id_video_original), sg.Text(status), sg.Text(status_thumb)
]
return layout
except Exception as e:
print(e)
return []
# Create an event loop
print('Running')
while True:
event, values = window.read()
window["CONTAINER_VIDEOS"].update([get_layout_video(v) for v in sessao.videos] if len(sessao.videos) > 0 else [[]])
if event == sg.WIN_CLOSED:
break
我调试了几种不同的可能性。导致列表更改的事件被省略了,但我确信它们有效。 get_layout_video
的结果是正确的,它看起来像一个正常的列布局,类似于测试。我也尝试了一个空列表 [[]]
,但没有任何反应。 Column 只是保持它的原始值。当我尝试另一种类型的元素(例如 sg.Text)时,它可以正常工作,更新值。我做错了什么?
我找不到如何直接更改 sg 的列,但我制作了一个更新功能可以解决您的问题,它将关闭并使用更新后的列重新创建 sg window。
这是更新列的代码。
def update_column():
global window
layout = [
[sg.Text("Clique para iniciar:")],
*[[sg.Button(k)] for k in botoes],
# [sg.Column([[sg.Text('Passos')]], key = 'CONTAINER_STATUS')],
[sg.Text('Índice Vídeo Selecionado:'), sg.In(key=0), sg.In(key=1, enable_events=True)],
# [sg.Text('Status Vídeos: ')],
[sg.Text('Vídeo'), sg.Text('Status Vídeo'), sg.Text('Status Thumbnail')],
[sg.Column([get_layout_video(v) for v in sessao.videos] if len(sessao.videos) > 0 else [[]], key='CONTAINER_VIDEOS', size=(150, 50))],
]
window.close()
window = sg.Window("Iniciar Processamento de Vídeo", layout)
print('Running')
while True:
event, values = window.read()
update_column()
if event == sg.WIN_CLOSED:
break
一些照片:
before I click anything:
after I click something:
尝试使用 PySimpleGUI 构建一个简单的 window。我想要一个包含列表中存储的视频信息的行列表。这是我的代码:
layout = [
[sg.Text("Clique para iniciar:")],
*[[sg.Button(k)] for k in botoes],
# [sg.Column([[sg.Text('Passos')]], key = 'CONTAINER_STATUS')],
[sg.Text('Índice Vídeo Selecionado:'), sg.In(key=0), sg.In(key=1, enable_events=True)],
# [sg.Text('Status Vídeos: ')],
[sg.Text('Vídeo'), sg.Text('Status Vídeo'), sg.Text('Status Thumbnail')],
[sg.Column([[sg.Text('test'), sg.Text('test2')],[sg.Text('test3'),sg.Text('test4')]], key='CONTAINER_VIDEOS', size= (50, 50))],
]
window = sg.Window("Iniciar Processamento de Vídeo", layout)
def get_layout_video(video):
status = video.status.name if video.status is not None else ''
status_thumb = video.thumbnail.status.name if video.thumbnail.status is not None else ''
try:
layout = [
sg.Text(video.id_video_original), sg.Text(status), sg.Text(status_thumb)
]
return layout
except Exception as e:
print(e)
return []
# Create an event loop
print('Running')
while True:
event, values = window.read()
window["CONTAINER_VIDEOS"].update([get_layout_video(v) for v in sessao.videos] if len(sessao.videos) > 0 else [[]])
if event == sg.WIN_CLOSED:
break
我调试了几种不同的可能性。导致列表更改的事件被省略了,但我确信它们有效。 get_layout_video
的结果是正确的,它看起来像一个正常的列布局,类似于测试。我也尝试了一个空列表 [[]]
,但没有任何反应。 Column 只是保持它的原始值。当我尝试另一种类型的元素(例如 sg.Text)时,它可以正常工作,更新值。我做错了什么?
我找不到如何直接更改 sg 的列,但我制作了一个更新功能可以解决您的问题,它将关闭并使用更新后的列重新创建 sg window。
这是更新列的代码。
def update_column():
global window
layout = [
[sg.Text("Clique para iniciar:")],
*[[sg.Button(k)] for k in botoes],
# [sg.Column([[sg.Text('Passos')]], key = 'CONTAINER_STATUS')],
[sg.Text('Índice Vídeo Selecionado:'), sg.In(key=0), sg.In(key=1, enable_events=True)],
# [sg.Text('Status Vídeos: ')],
[sg.Text('Vídeo'), sg.Text('Status Vídeo'), sg.Text('Status Thumbnail')],
[sg.Column([get_layout_video(v) for v in sessao.videos] if len(sessao.videos) > 0 else [[]], key='CONTAINER_VIDEOS', size=(150, 50))],
]
window.close()
window = sg.Window("Iniciar Processamento de Vídeo", layout)
print('Running')
while True:
event, values = window.read()
update_column()
if event == sg.WIN_CLOSED:
break
一些照片:
before I click anything:
after I click something: