【问题标题】:PySimpleGUI - Column won't updatePySimpleGUI - 列不会更新
【发布时间】:2021-06-15 23:31:06
【问题描述】:

尝试使用 PySimpleGUI 构建一个简单的窗口。我想要一个包含存储在列表中的视频信息的行​​列表。这是我的代码:

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)时,它可以正常工作,更新值。我做错了什么?

【问题讨论】:

  • 检查方法updateColumnpysimplegui.readthedocs.io/en/latest/call%20reference/…,只有一个选项visible,没有布局更新。
  • 我明白了。谢谢你。你知道我应该使用什么样的元素来实现我想要做的事情吗?在我的窗口布局中添加动态行数。
  • 有一些方法可以走,但没有动态布局。例如,新窗口、可见/不可见元素或sg.Columnsg.pin

标签: python user-interface pysimplegui


【解决方案1】:

我找不到如何直接更改 sg 的列,但我做了一个更新功能可以解决您的问题,它将关闭并使用更新的列重新创建 sg 窗口。

这是更新列的代码。

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:

【讨论】:

  • 谢谢!我想这可以解决问题。我害怕做这种事情会产生其他意想不到的影响。实际上,这是否会导致输入变为空白,对吗?目前无法测试,但有时间我会提供更多反馈,如果可行,请选择此答案。
  • 您始终可以在关闭和重新打开窗口之前保存输入,然后您可以将输入放回原处。或者您可以在计算结束时调用此 update_column 函数,这取决于您的需要。如果您还有什么需要帮助的,请告诉我。
  • 谢谢你的帮助,伙计。我最终决定走一条不同的路线,因为我认为在我的用例中它比存储输入更简单,所以我在列中有固定数量的行,并更新这些行的文本以获得预期的结果.感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多