2017-02-17 4 views
2

Я новичок в wxpython. Я не могу перекрывать панели. В общем, это легко сделать с помощью двух или нескольких панелей, но если одна из панелей имеет контейнер MediaCtrl, воспроизводящий видео на полном экране дисплея, тогда любая другая панель не будет видна над ним. Я попытался с помощью метода panel.Raise(), но все же, он не работает. Все, что я с нетерпением жду, это наложить панель фиктивных объектов на StaticText поверх панели videoPlayer. В приведенном ниже коде зеленая рамка идет ниже контроллера MediaCtrl. Я должен как-то принести панель панелей над панелью видео. Я рассмотрел много вопросов, но все, что я мог получить, это использовать .Raise(), который не работает в моем случае.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 в вертикальной компоновке обе панели входят в вертикальную компоновку, тогда как я пытаюсь вывести bannerPanel над videoPlayerPanel. – rohitranjan

+0

Я отредактировал свой ответ, я думаю, что им может понадобиться отдельный сизер, а затем поднять второй. –

+0

Привет, Ник, Спасибо, что посмотрели на это. Я попытался с приведенным выше кодом, и в идеале ваш код должен работать с панелями с такими виджетами, как статический текст и т. Д., Но я думаю, что проблема должна что-то делать с помощью wx.media.MediaCtrl, который я использую для видеоплеера, и каким-то образом не позволяет поднимать над ним другой поднятый вид/панель. – rohitranjan

1

@rohitranjan, этот ответ был слишком длинным для комментария, у меня возникли проблемы со средством mediactrl. Единственный другой способ, с помощью которого я мог бы подумать, - это создать второе прозрачное окно (фрейм) поверх всего лишь с отображением текста. То, что я пытаюсь здесь, но обеспечение окна в нужном месте может оказаться сложным. Моя другая мысль была бы - это статическое видео, а не потоковое? вы можете наложить текст сначала с помощью другого процесса, такого как openCV. Я не могу много помнить, но это что-то вроде: import cv2 и cv2.puText(frame, text, position). Вам могут понадобиться cv2.VideoWriter() и cv2.VideoCapture(). Это то, что я буду смотреть дальше, накладывать текст до импорта wx и воспроизводить видео. открытый поиск opencv, наложение видеотекста должно оказаться полезным.

+0

Привет, Ник, спасибо за предложение, я попытался нарисовать текст, например https://wiki.wxpython.org/VerySimpleDrawing, но даже это не видно по видео , Я также попытался поднять текстовое представление и опустить видеопроигрыватель, но все же, как-то вид видеоплеер приходит сверху, скрывая все остальные виджеты. Я не мог найти подходящую статью, соединяющую OpenCV с wxpython frame/panel. Если бы вы могли направить меня на сайт с этим, это поможет мне попробовать. Думаю, придется искать в mediactrl немного глубже, чтобы найти ответ. – rohitranjan

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

+0

Привет, Спасибо, что представил меня в MoviePy. Это действительно работает так, как вы говорите. Но проблема в том, что есть много других виджетов, которые я должен поставить над панелью видео, а также текст в моем случае будет продолжать меняться с помощью другого триггера. Таким образом, вы видите, как-то я должен получить панель над панелью видео. – rohitranjan

 Смежные вопросы

  • Нет связанных вопросов^_^