如何在Tkinter中切换嵌入式VLC实例的根窗口且不中断播放
不中断播放实现VLC播放器在Tkinter窗口间切换全屏
你的问题出在每次切换窗口时都调用了player.stop()并重新加载媒体,这才导致播放中断。实际上VLC播放器支持在不停止播放的情况下切换输出窗口,只需要调用set_xwindow()切换嵌入的窗口ID即可,无需重新初始化媒体或停止播放。
以下是修改后的完整代码,支持无缝切换全屏/窗口模式,播放不中断:
from tkinter import ( Tk, Frame, Button, Toplevel, BOTH ) from vlc import Instance class Test: def __init__(self): self.Instance = Instance() self.player = self.Instance.media_player_new() # 主窗口初始化 self.root = Tk() self.root.geometry("800x800") self.frame = Frame(self.root, width=700, height=600) self.frame.pack() # 控制按钮 Button(self.root, text="播放", command=self.play).pack(side='left') Button(self.root, text="切换全屏", command=self.toggle_fullscreen).pack(side='left') # 窗口模式的播放容器 self.display_frame = Frame(self.frame, bd=5) self.display_frame.place(relwidth=1, relheight=1) # 预初始化全屏窗口(避免每次切换都新建) self.fullscreen_win = Toplevel(self.root) self.fullscreen_win.withdraw() # 初始隐藏 self.fullscreen_win.attributes("-fullscreen", True) # 绑定关闭全屏窗口事件,回到窗口模式 self.fullscreen_win.protocol("WM_DELETE_WINDOW", self.exit_fullscreen) self.is_fullscreen = False # 跟踪当前状态 self.root.mainloop() def play(self): # 仅第一次播放时加载媒体,之后切换不需要重复加载 if not self.player.get_media(): media = self.Instance.media_new('test.webm') self.player.set_media(media) # 设置初始播放窗口 self.player.set_xwindow(self.display_frame.winfo_id()) self.player.play() def toggle_fullscreen(self): if not self.player.is_playing(): return # 没播放时不切换 if self.is_fullscreen: # 从全屏切回窗口模式 self.fullscreen_win.withdraw() self.player.set_xwindow(self.display_frame.winfo_id()) self.is_fullscreen = False else: # 切换到全屏模式 self.fullscreen_win.deiconify() self.player.set_xwindow(self.fullscreen_win.winfo_id()) self.is_fullscreen = True def exit_fullscreen(self): # 关闭全屏窗口时自动切回 self.fullscreen_win.withdraw() self.player.set_xwindow(self.display_frame.winfo_id()) self.is_fullscreen = False def main(): Test() if __name__ == '__main__': main()
关键改动说明:
- 预初始化全屏窗口:提前创建Toplevel全屏窗口并隐藏,避免每次切换时重复创建窗口,提升流畅度
- 状态跟踪:用
is_fullscreen变量记录当前模式,实现一键切换全屏/窗口 - 无中断切换核心:切换时仅调用
player.set_xwindow()更换嵌入的窗口ID,不调用stop()或重新设置媒体,播放完全不中断 - 全屏窗口关闭处理:绑定窗口关闭事件,确保关闭全屏窗口时播放器切回原窗口
内容的提问来源于stack exchange,提问作者Willem van Houten
相关产品推荐
相关产品推荐

