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

PySimpleGUI播放视频时界面无响应问题求助

问题:PySimpleGUI窗口播放视频时无响应

我开发了一款监控网站视频、随机播放并自动续播的程序,采用PySimpleGUI作为交互界面。程序平时运行正常,但调用播放存储在txt文件中URL视频的功能时,视频可正常播放,但PySimpleGUI窗口出现无响应情况。尝试使用多线程解决,但未取得理想效果,求解决方案。

相关代码

def main():
    window1, window2, window3 = mainMenu(),None, None # start off with mainMenu opened first

    while True:
        window, event, values = sg.read_all_windows()
        if event == sg.WIN_CLOSED or event == '-EXIT-':
            window.close()
            if window == window2:
                window2 = None
            elif window == window3:
                window3 = None
            elif window == window1:
                break
        """
        Change Screen to Set Weekly Reset window
        """
        if event == '-RESET-':
            window2 = weeklyReset()

        """
        Button press is passed to dayOfReset.txt
        """
        if event == 'Sunday':
            weeklySchedule.setDayOfReset('Sunday')
        elif event == 'Monday':
            weeklySchedule.setDayOfReset('Monday')
        elif event == 'Tuesday':
            weeklySchedule.setDayOfReset('Tuesday')
        elif event == 'Wednesday':
            weeklySchedule.setDayOfReset('Wednesday')
        elif event == 'Thursday':
            weeklySchedule.setDayOfReset('Thursday')
        elif event == 'Friday':
            weeklySchedule.setDayOfReset('Friday')
        elif event == 'Saturday':
            weeklySchedule.setDayOfReset('Saturday')
        # ------------------------------------------ #
        """
        Change Screen to Settings window
        """
        if event == '-SETTINGS-' and not window2 or window3:
            window3 = settings()
        # ------------------------------------------ #

        # WEEKLY SCHEDUAL OPTION
        if event == '-WEEKLY-':
            daysOfWeek = weeklySchedule.get_dayOfWeek()
            weeklySchedule.play_video(daysOfWeek)

        # DUBBED ANIME OPTION
        elif event == '-DUBBED-':
            print("THIS IS DUB ONLY")
            url = "https://www.wcofun.com/dubbed-anime-list"
            numOfShows = 3
            schedule = typeChoice.choiceSchedule(url, numOfShows)
            typeChoice.play_video(schedule)

        # SUBBED ANIME OPTION
        elif event == '-SUBBED-':
            print("THIS IS SUB ONLY")
            url = "https://www.wcofun.com/subbed-anime-list"
            numOfShows = 3
            schedule = typeChoice.choiceSchedule(url, numOfShows)
            typeChoice.play_video(schedule)

        # ANIMATED CARTOONS
        elif event == '-OTHER-':
            print("THIS IS OTHER CARTOONS")
            url = "https://www.wcofun.com/cartoon-list"
            numOfShows = 3
            schedule = typeChoice.choiceSchedule(url, numOfShows)
            typeChoice.play_video(schedule)

        # MOVIE OPTION
        elif event == '-MOVIE-':
            print("THIS IS MOVIES")
            url = "https://www.wcofun.com/movie-list"
            schedule = movieChoice.choice_movie_schedule(url)
            movieChoice.play_video(schedule)

        # Close the program
        elif event == '-CLOSE-':
            quit()


    window.close()

        # if event == '-SETTINGS-':
        #     print('this is settings')
if __name__ == '__main__':
    main()

解决方案

1. 核心问题分析

你直接在PySimpleGUI的主线程事件循环中调用play_video等耗时方法,视频播放、网络请求这类操作会阻塞主线程,导致GUI无法处理界面刷新和用户事件,最终窗口无响应。

2. 正确的多线程实现

将所有耗时操作(视频播放、网络请求)移到子线程执行,同时遵守PySimpleGUI的线程规则:子线程不能直接修改GUI元素,需通过window.write_event_value()向主线程发送事件。

修改示例(以-WEEKLY-事件为例):

import threading

# 定义线程执行的播放逻辑函数
def run_play_video(window, daysOfWeek):
    weeklySchedule.play_video(daysOfWeek)
    # 播放结束后可通知主线程(可选)
    window.write_event_value('-PLAY_COMPLETED-', None)

# 在main函数的事件循环中修改-WEEKLY-事件处理:
if event == '-WEEKLY-':
    daysOfWeek = weeklySchedule.get_dayOfWeek()
    # 启动守护线程,随主程序退出自动结束
    threading.Thread(target=run_play_video, args=(window, daysOfWeek), daemon=True).start()

3. 全局修改要求

所有涉及网络请求(如choiceSchedule、choice_movie_schedule)和视频播放的方法,都要按上述方式放到子线程中执行,避免阻塞主线程。

4. 排查之前多线程失败的常见原因

  • 仅将部分耗时操作移到线程,比如只处理播放但没处理前置的网络请求
  • 子线程中直接修改了PySimpleGUI的元素,触发线程安全问题
  • 未设置daemon=True,导致线程残留影响程序运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:47:10