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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:10:20