2017-02-17 19 views
2

私はwxpythonの初心者です。私はパネルを重ねることができません。一般に、2つ以上のパネルで簡単に行うことはできますが、パネルの1つにMediaCtrlコンテナがフルディスプレイ画面でビデオを再生している場合、他のパネルはその上に表示されません。私はpanel.Raise()メソッドで試しましたが、まだ動作していません。 私が期待しているのは、videoPlayerパネルでStaticTextをダミーパネルに重ねることです。下のコードでは、緑色のボックスがMediaCtrlコントローラの下に来ています。私は何とかビデオパネルの上にbannelパネルを持っていなければなりません。私はたくさんの質問をしましたが、私が得ることができるのは、私のケースでは動作していない。ライズ()を使用することです。WXPython Video MediaCtrlボタンオーバーカスタム

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

答えて

1

サイザーを追加して、サイザーにパネルを追加してみてください。これにより、パネルを操作して適切な場所に保管できるようにする必要があります。その上で良いの読み取りが何ができるか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() 

、あなたは本当に良いのリンクを見て、パネルサイズとフレーム上の位置を設定することができます説明。

+0

こんにちはニック、返信ありがとうございます。しかし、BoxSizerを縦型レイアウトにすると、両方のパネルが縦型レイアウトになりますが、videoPlayerPanelの上にbannerPanelを配置しようとしています。 – rohitranjan

+0

私は自分の返信を編集しました。私は彼らが別のサイザーにいなければならないかもしれないと思います。 –

+0

こんにちはニック、これを見ていただきありがとうございます。私は上記のコードを試して理想的にはあなたのコードはstatictextなどのウィジェットを持つパネルで動作するはずですが、問題は私がビデオプレーヤーに使用しているwx.media.MediaCtrlで何かをしなければならないと思います他の盛り上がったビュー/パネルがその上に来ることを許可していません。 – rohitranjan

1

@rohitranjan、この回答はコメントのために長すぎました。私はmediactrlに問題があります。私が考えている唯一の他の方法は、テキストだけを表示して、上に2番目の透明なウィンドウ(フレーム)を作成することです。それは私がここで何をしようとしていることですが、ウィンドウが正しい場所にあることを保証することは難しいと分かるかもしれません。私の他の考えは、静的なビデオ、つまりストリーミングされていないのでしょうか? openCVのような別のプロセスを使用してテキストを最初にオーバーレイすることができます。私はそれほど思い出せませんが、それはimport cv2cv2.puText(frame, text, position)のようなものです。 cv2.VideoWriter()cv2.VideoCapture()も必要な場合があります。それは私が次に見るもので、wxをインポートする前にテキストを重ねてビデオを再生します。オープンにopencvを検索すると、ビデオテキストのオーバーレイが役立つはずです。

+0

こんにちはニック、提案のおかげで、私はhttps://wiki.wxpython.org/VerySimpleDrawingのようなテキストをペイントしようとしましたが、これはビデオでは見えません。私もtextviewを上げてビデオプレーヤーのビューを下げようとしましたが、何とかビデオプレーヤーのビューが他のすべてのウィジェットを隠しています。 OpenCVとwxpythonフレーム/パネルを結ぶ適切な記事が見つかりませんでした。あなたはそれを持っているウェブサイトに私を導くことができれば、それは私がそれを試みるのを助けるでしょう。私は答えを見つけるために少し深くmediactrlを調べなければならないと思う。 – rohitranjan

1

私はここで働いています。最初にビデオにテキストを追加してから、wxを使ってビデオを再生しています。つまり、本質的に、ビデオの「編集前」です。あなたのビデオサイズに応じて最初はメガ高速ではありませんが、ただ1つのビデオを再生しているので、プロセスがずっと簡単になります。 MoviePyを使用しています。MoviePyは、ビデオを読み込み、上にテキストを追加して、同じディレクトリに書き出します。私はあなたが1つのウィンドウに「output.mp4」を使用してコードの残りの部分を実行することができ、ここから続いてトップ

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

であなたの元のコードにこれを追加しました。それはあなたが必要とするものではないかもしれません。最初にファイルを処理するのに少し時間がかかりますが、ストリームでなければそれはうまく動作します。どのシステムを実行しているのか分かりませんが、ここではMoviePyモジュールへのリンクがあります。 https://zulko.github.io/moviepy/crash_course/crash_course.html

+0

こんにちは、私をMoviePyに紹介してくれてありがとう。それは本当にあなたが言うべき方法で動作します。しかし、問題は、私がビデオパネルの上に置かなければならない他のウィジェットがたくさんあり、私の場合のテキストも他のトリガーで変わっていくことです。だから何とか私はビデオパネルの上にパネルを取得する必要があります参照してください。 – rohitranjan