WXPython视频MediaCtrl自定义按钮

时间:2017-02-17 09:00:44

标签: python wxpython

我是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()

3 个答案:

答案 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 cv2cv2.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