我是wxpython的新手。我无法重叠面板。通常,使用两个或多个面板很容易做到,但如果其中一个面板有MediaCtrl容器在完整显示屏幕上播放视频,则其上方的任何其他面板都不可见。我尝试使用panel.Raise()方法,但仍然无法正常工作。 我期待的是在videoPlayer面板上将虚拟面板与StaticText重叠。在下面的代码中,绿色框位于MediaCtrl控制器下方。我必须以某种方式将bannel面板放在视频面板上方。我经历了很多问题,但我能得到的就是使用.Raise()whihc在我的情况下不起作用。
import wx
import wx.media
import os
########################################################################
class MyPanel(wx.Panel):
""""""
# ----------------------------------------------------------------------
def __init__(self, parent):
""""""
wx.Panel.__init__(self, parent)
self.parent_size = parent.GetClientSize()
self.init_view()
def init_view(self):
#self.SetDimensions(0, 0, wx.GetDisplaySize().width, wx.GetDisplaySize().height)
self.SetDimensions(0, 0, 50,50)
self.text_view = wx.StaticText(self, size=(1020, 40), pos=(10, 10), label="Some Label")
self.mc = wx.media.MediaCtrl(self)
# from wx.animate import AnimationCtrl
# self.text_view.write("ABDS")
self.settings_btn = wx.Button(self, -1, "Settings")
self.Bind(wx.EVT_BUTTON, self.settings_button_clicked, self.settings_btn)
self.Bind(wx.EVT_LEFT_UP, self.on_panel_clicked)
print(os.path.exists("SampleVideo_1280x720_10mb.mp4"))
path = os.path.dirname(os.path.abspath("SampleVideo_1280x720_10mb.mp4")) + "/SampleVideo_1280x720_10mb.mp4"
if not self.mc.Load(path):
print("unable to load video")
else:
self.mc.SetInitialSize()
self.mc.Play()
def on_panel_clicked(self, event):
print("panel clicked...")
if self.settings_btn.IsShown():
self.settings_btn.Hide()
else:
self.settings_btn.Show()
def settings_button_clicked(self, event):
print("Settings Btn Clicked...")
class BannerPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.SetBackgroundColour("green")
self.SetDimensions(0, 0, 100, 100)
self.Raise()
#self.ToggleWindowStyle(wx.STAY_ON_TOP)
########################################################################
class MyFrame(wx.Frame):
""""""
# ----------------------------------------------------------------------
def __init__(self):
""""""
# wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN
wx.Frame.__init__(self, None, title="Test Maximize", size=wx.Size(1100, 700), style=wx.CLIP_CHILDREN)
self.videoPlayerPanel = MyPanel(self)
self.bannerPanel = BannerPanel(self)
self.Show()
# self.videoPlayerPanel.mc.Lower()
self.bannerPanel.Raise()
# print(self.GetClientSize())
# self.Maximize(True)
# self.initGUI()
if __name__ == "__main__":
app = wx.App(False)
frame = MyFrame()
# frame.ShowFullScreen(True)
app.MainLoop()
答案 0 :(得分:1)
尝试添加sizer,然后将面板添加到sizer中。这应确保可以操作面板并将其保持在正确的位置。好好阅读https://wiki.wxpython.org/BoxSizerFromTheGroundUp 您可以做的是编辑:
class MyFrame(wx.Frame):
""""""
# ----------------------------------------------------------------------
def __init__(self):
""""""
# wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN
wx.Frame.__init__(self, None, title="Test Maximize", size=wx.Size(1100, 700), style=wx.CLIP_CHILDREN)
self.videoPlayerPanel = MyPanel(self)
self.bannerPanel = BannerPanel(self)
self.vsizer = wx.BoxSizer(wx.VERTICAL)
self.vsizer.Add(self.videoPlayerPanel, 0)
self.videoPlayerPanel.SetSizer(self.vsizer)
self.videoPlayerPanel.Show()
self.bsizer = wx.BoxSizer(wx.VERTICAL)
self.bsizer.Add(self.bannerPanel, 0)
self.bannerPanel.SetSizer(self.bsizer)
self.bannerPanel.Raise()
self.bannerPanel.Show()
通过一些调整,您可以设置面板尺寸及其在框架上的位置,查看链接以获得非常好的解释。
答案 1 :(得分:1)
@rohitranjan,这个答案太长了,无法发表评论,我在使用mediactrl时遇到了麻烦。我能想到的唯一另一种方法就是在顶部创建第二个透明窗口(框架),只显示文本。多数民众赞成我在这里尝试,但确保窗口在正确的位置可能会很棘手。我的另一个想法是 - 它是静态视频,即不流式传输?您可以先使用不同的进程覆盖文本,例如openCV。我记忆不清,但它类似于:import cv2
和cv2.puText(frame, text, position)
。您可能还需要cv2.VideoWriter()
和cv2.VideoCapture()
。这就是我接下来要研究的内容,在wx导入之前覆盖文本并播放视频。公开搜索opencv,视频文本叠加应该证明是有用的。
答案 2 :(得分:1)
好的,我有一些工作在这里,我首先在视频中添加文字,然后只使用wx播放视频。基本上,“预编辑”视频。根据您的视频大小,它最初不是超快速,但它使得过程变得如此简单,因为您只是播放单个视频。我正在使用导入视频的MoviePy,在顶部添加文本,然后将其导出到同一目录。我将其添加到顶部的原始代码中
from moviepy.editor import *
clip = VideoFileClip("your_video.mp4")
txt_overlay = TextClip("test text", fontsize=50, color='white')
clip.write_videofile("output.mp4", codec='mpeg4')
然后从这里开始,您可以在一个窗口中使用'output.mp4'运行其余代码。它可能不完全是你需要的,因为它最初需要一点时间处理文件,但如果它不是一个流,那么它的工作效果非常好。我不确定你在运行什么系统,但这里是MoviePy模块的链接。 https://zulko.github.io/moviepy/crash_course/crash_course.html