【发布时间】:2023-02-17 20:13:20
【问题描述】:
我正在开发一个多平台应用程序,它通过 python-vlc 操作 VLC 并使其在 Tkinter 窗口中绘制。
我正在使用以下简化代码(灵感来自tkvlc.py example from python-vlc):
import os
import platform
import sys
import tkinter
from ctypes import c_void_p, cdll
from threading import Thread
import vlc
system = platform.system()
if system == "Darwin":
# find the accurate Tk lib for Mac
libtk = "libtk%s.dylib" % (tkinter.TkVersion,)
if "TK_LIBRARY_PATH" in os.environ:
libtk = os.path.join(os.environ["TK_LIBRARY_PATH"], libtk)
else:
prefix = getattr(sys, "base_prefix", sys.prefix)
libtk = os.path.join(prefix, "lib", libtk)
dylib = cdll.LoadLibrary(libtk)
_GetNSView = dylib.TkMacOSXGetRootControl
_GetNSView.restype = c_void_p
_GetNSView.argtypes = (c_void_p,)
del dylib
class Window(tkinter.Tk):
def register(self, player):
id = self.winfo_id()
print(id)
if system == "Darwin":
player.set_nsobject(_GetNSView(id))
elif system == "Linux":
player.set_xwindow(id)
elif system == "Windows":
player.set_hwnd(id)
def play(instance, player, path):
media = instance.media_new_path(path)
player.set_media(media)
player.play()
if __name__ == "__main__":
instance = vlc.Instance()
player = instance.media_player_new()
window = Window()
window.register(player)
thread = Thread(target=play, args=(instance, player, sys.argv[1]))
thread.start()
window.mainloop()
在 MacOS 上,视频的大小不适应窗口的大小。 如果视频对于窗口而言太大,则会被裁剪,如果太小,则会位于左下角并被黑色包围。 只有在调整窗口大小时,视频的大小才会更新。 Here 是问题的视频捕获。 这不会发生在 Linux 或 Windows 上。
如果对 OnResize 方法的调用在第 471 行被阻止(该方法调整窗口大小以具有视频的大小比例),则 tkvlc.py example from python-vlc 也会出现同样的问题。
我应该怎么做才能强制 VLC 调整视频大小以自动适应窗口,就像在其他操作系统上默认做的那样?
【问题讨论】:
标签: python-3.x macos tkinter vlc python-vlc