You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySimpleGUI中如何实现多个GIF动画同步更新?

解决PySimpleGUI中多GIF同步动画问题

核心问题是所有Image元素共用了同一个key -post-,PySimpleGUI中key是控件的唯一标识,因此每次调用window['-post-'].UpdateAnimation()只会更新第一个匹配的控件,其他GIF自然无法动起来。

以下是修改后的完整代码,可实现所有GIF同步播放:

import PySimpleGUI as sg

sg.theme('darkgray12')
colors = (sg.theme_background_color(), sg.theme_background_color())

counter = 1
firstTime = True

def post(img_key):
    # 为每个Image生成唯一key
    post_layout = [sg.Frame('',[
        [sg.Image('1.gif', size=(600, 600), key=img_key)],
    ], key=f'-POST-{counter}')]
    return post_layout

layout = [
    [sg.Frame(title='', layout=[
        [sg.pin(sg.Button('LOAD', key='-LOAD-POST-')), sg.Push(), sg.pin(sg.Text('#10', key='-POST-COUNTER-TEXT-'))],
        [sg.pin(sg.Column([], size=(700, 600), key='-COL1-', scrollable=True, vertical_scroll_only=True, expand_y=True, expand_x=True, element_justification='c'))],
    ], key='-MAIN-FRAME-')],
]

window = sg.Window('Fixed - All GIFs animate', layout, size=(800, 600), grab_anywhere=True, font=('Montserrat', 9, 'bold'), element_justification='c')

# 存储所有Image控件的key,用于批量更新动画
image_keys = []

while True:
    event, values = window.read(100)
    if event == sg.WIN_CLOSED:
        break

    if firstTime:
        for i in range(10):
            img_key = f'-POST-IMAGE-{counter}'
            image_keys.append(img_key)
            window.extend_layout(window['-COL1-'], [post(img_key)])
            window.refresh()
            window['-COL1-'].contents_changed()
            counter += 1
        firstTime = False
        window['-POST-COUNTER-TEXT-'].update(f'#{counter - 1}')

    if event == '-LOAD-POST-':
        if counter <= 40:
            added = 0
            for i in range(10):
                if counter > 40:
                    break
                img_key = f'-POST-IMAGE-{counter}'
                image_keys.append(img_key)
                window.extend_layout(window['-COL1-'], [post(img_key)])
                window.refresh()
                window['-COL1-'].contents_changed()
                counter += 1
                added += 1
            window['-POST-COUNTER-TEXT-'].update(f'#{counter - 1}' + ('(MAX)' if counter > 40 else ''))

    # 遍历所有Image控件,逐个更新动画实现同步
    for key in image_keys:
        window[key].UpdateAnimation('1.gif', 10)

window.close()

关键改动说明:

  • 修改post函数,新增img_key参数,确保每个Image控件拥有唯一标识key
  • 新增image_keys列表,记录所有生成的Image控件key,方便后续批量操作
  • 主循环末尾遍历image_keys,对每个Image控件调用UpdateAnimation,实现全量同步动画
  • 修复LOAD按钮的计数器判断逻辑,确保最多只加载40个帖子

内容的提问来源于stack exchange,提问作者MrLucifer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:12:31