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
相关产品推荐
相关产品推荐

