Tkinter单按钮实现视频播放与页面跳转故障排查
问题分析与解决方案
核心问题出在Page2中错误创建了新的Page3实例:你在Page2的__init__里新建了nextpage = Page3(parent, controller),但GUI框架已经在初始化时创建了Page3的实例并存在controller.frames中。你调用的是这个新实例的play_video,而非界面上实际显示的那个Page3实例的方法,所以视频不会播放。
修正步骤
1. 修改Page2代码,复用已有Page3实例
删除自己创建的Page3对象,直接从controller的frames字典中获取已初始化的Page3实例:
import tkinter as tk from tkinter import * from page3 import * class Page2(Frame): def __init__(self, parent, controller): Frame.__init__(self, parent) DF = Listbox(self, bg='#f8f8f8',height=30, width=70, highlightthickness=0, borderwidth=0) DF.place(x=0, y=0) # 直接获取GUI中已存在的Page3实例 page3_instance = controller.frames[Page3] button = Button( DF, text="press", bg='#ffffff', height=4, width=30, # 先切换页面,再调用对应实例的播放方法 command=lambda: [controller.show_frame(Page3), page3_instance.play_video()], ) button.place(relx=0.5, rely=0.5, anchor=CENTER)
2. 给Page3添加视频重置方法
在Page3类中新增reset_video方法,用于将视频恢复到开头,同时可以在播放前先重置,避免视频播放到末尾后无法重新播放:
import tkinter as tk from tkinter import * from tkVideoPlayer import TkinterVideo class Page3(Frame): def __init__(self, parent, controller): Frame.__init__(self, parent) DF2 = Listbox(self, bg='green',height=30, width=70, highlightthickness=0, borderwidth=0) DF2.place(x=0, y=0) self.vid_player = TkinterVideo(DF2, scaled = True) self.vid_player.place(x=0, y=0) self.vid_player.load("Location_of_MP4.mp4") def play_video(self): # 播放前先重置到开头 self.reset_video() print("working") self.vid_player.play() def reset_video(self): # 将视频进度设置为0,回到开头 self.vid_player.seek(0)
3. 验证逻辑
- GUI初始化时,所有页面实例已创建并存入
controller.frames - 点击Page2的按钮时,先调用
controller.show_frame(Page3)切换到显示的Page3实例,再调用该实例的play_video,此时操作的是界面上的视频播放器 reset_video方法通过seek(0)将视频拉回开头,解决视频播放完毕后无法重启的问题
内容的提问来源于stack exchange,提问作者JimV
相关产品推荐
相关产品推荐

