2017-02-17 4 views
2

Ich bin ein Neuling für wxpython. Ich kann die Panels nicht überlappen. Im Allgemeinen ist es leicht, dies mit zwei oder mehreren Panels zu tun, aber wenn in einem der Panels der MediaCtrl-Container Video auf dem gesamten Bildschirm anzeigt, ist darüber kein anderes Panel sichtbar. Ich habe es mit der panel.Raise() Methode versucht, aber es funktioniert immer noch nicht. Ich freue mich darauf, ein Dummy-Panel mit einem StaticText über das videoPlayer-Panel zu überlappen. Im folgenden Code wird die grüne Box unterhalb des MediaCtrl-Controllers angezeigt. Ich muss das Bannel Panel irgendwie über das Video Panel bringen. Ich habe eine Menge Fragen gestellt, aber alles, was ich bekommen konnte, ist die Verwendung von .Raise(), die in meinem Fall nicht funktioniert.WXPython Video MediaCtrl benutzerdefinierte Schaltfläche

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

Antwort

1

Versuchen Sie, einen Sizer hinzuzufügen und fügen Sie dann die Panels dem Sizer hinzu. Dies sollte sicherstellen, dass die Paneele manipuliert und an der richtigen Stelle gehalten werden können. Ein gutes Buch auf es https://wiki.wxpython.org/BoxSizerFromTheGroundUp Was können Sie tun, ist edit:

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

Mit ein bisschen Zwicken, können Sie die Plattengrößen und deren Position auf dem Rahmen festgelegt, haben einen Blick auf den Link für einen wirklich guten Erläuterung.

+0

Hallo Nick, Danke für die Antwort. Aber mit BoxSizer im vertikalen Layout kommen beide Panels in einem vertikalen Layout, während ich versuche, das bannerPanel über das videoPlayerPanel zu bringen. – rohitranjan

+0

Ich habe meine Antwort bearbeitet, ich denke, dass sie in einem separaten Sizer sein müssen, dann heben Sie den zweiten an. –

+0

Hallo Nick, Danke, dass du dir das angeschaut hast. Ich habe versucht, mit dem oben genannten Code und idealerweise sollte Ihr Code mit den Panels mit Widgets wie Statictext, etc. arbeiten, aber ich denke, das Problem muss etwas speziell mit der wx.media.MediaCtrl tun, die ich für den Videoplayer und irgendwie es verwende erlaubt keine andere angehobene Ansicht/Platte darüber zu kommen. – rohitranjan

1

@rohitranjan, diese Antwort war zu lang für einen Kommentar, ich habe Probleme mit dem mediactrl. Der einzige andere Weg, an den ich denken könnte, wäre, ein zweites transparentes Fenster (Rahmen) über dem oberen Rand zu erstellen, wobei nur der Text angezeigt wird. Das ist, was ich hier versuche, aber das Fenster am richtigen Ort zu halten, kann sich als schwierig erweisen. Mein anderer Gedanke wäre - ist es ein statisches Video, d. H. Nicht gestreamt? Sie könnten den Text zuerst mit einem anderen Prozess wie openCV überlagern. Ich kann mich nicht viel erinnern, aber es ist etwas wie: import cv2 und cv2.puText(frame, text, position). Möglicherweise benötigen Sie auch cv2.VideoWriter() und cv2.VideoCapture(). Das ist, was ich als nächstes betrachten würde, habe den Text überlagert, bevor wx importiert und das Video spielt. Offenes Suchen nach opencv, Video-Text-Overlay sollte sich als nützlich erweisen.

+0

Hallo Nick, danke für den Vorschlag, ich habe versucht, einen Text wie https://wiki.wxpython.org/VerySimpleDrawing zu malen, aber auch das ist nicht über das Video sichtbar . Ich habe auch versucht, die Textansicht zu erhöhen und die Ansicht des Video-Players zu verringern, aber irgendwie kommt die Ansicht des Video-Players oben und versteckt alle anderen Widgets. Ich konnte keinen passenden Artikel finden, der OpenCV mit wxpython frame/panel verbindet. Wenn Sie mich auf eine Website führen könnten, würde es mir helfen, es zu versuchen. Ich denke, dass mediactrl ein wenig tiefer suchen muss, um die Antwort zu finden. – rohitranjan

1

Ok, ich habe etwas, das hier funktioniert, ich füge zuerst Text in das Video ein und benutze dann wx, um das Video abzuspielen. Also im Wesentlichen "Vorbearbeitung" des Videos. Es ist anfangs nicht mega schnell, abhängig von deiner Videogröße, aber es macht den Prozess so viel einfacher, da du nur ein einziges Video spielst. Ich verwende MoviePy, das das Video importiert, Text über den Anfang hinzufügt und dann in das gleiche Verzeichnis exportiert. Ich habe diese zu Ihrem ursprünglichen Code oben

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') 

Dann von hier aus können Sie den Rest des Codes mit ‚output.mp4‘ in einem einzigen Fenster ausgeführt werden. Es ist möglicherweise nicht genau das, was Sie brauchen, da es ein wenig Zeit benötigt, um die Datei zunächst zu verarbeiten, aber wenn es kein Stream ist, dann funktioniert es ziemlich gut. Ich bin mir nicht sicher, welches System Sie ausführen, aber hier ist der Link zum MoviePy-Modul. https://zulko.github.io/moviepy/crash_course/crash_course.html

+0

Hallo, Vielen Dank für die Einführung in MoviePy. Es funktioniert tatsächlich so, wie du es sagst. Aber das Problem ist, dass es viele andere Widgets gibt, die ich über dem Videofenster platzieren muss und auch der Text in meinem Fall wird sich mit einem anderen Auslöser ändern. Du siehst also irgendwie, dass ich das Panel über das Video Panel bringen muss. – rohitranjan

Verwandte Themen