wxPython: Дублировать wxPanel в нескольких фреймах

Можно ли клонировать wxPanel через пару кадров в wxPython?

  • Я пытался использовать тот же wxID, что имело большое значение.
  • Я попытался использовать тот же экземпляр элемента управления, что приводит к рисованию только одного.

В конечном итоге я пытаюсь отобразить вывод LibVLC (который визуализирует в wxPanel через hwnd) одновременно в двух кадрах. Один кадр находится внутри окна управления, чтобы обеспечить «предварительный просмотр» видео, а другой отображается в полноэкранном режиме на втором мониторе.

Вот сокращенная версия кода, который я использую для отображения вывода видео в окне предварительного просмотра:

class MainFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.video_panel = wx.Panel(self, wx.ID_ANY)
        self.video_panel.SetBackgroundColour(wx.Colour(0, 0, 0))
        sizer_video = wx.BoxSizer(wx.VERTICAL)
        sizer_video.Add(self.video_panel, 1, wx.ALL | wx.EXPAND, 2)
        self.SetSizer(sizer_video)
        self.Layout()
        self.Instance = Libraries.vlc.Instance()
        self.player = self.Instance.media_player_new()

    def mediaLoad(self, path):
        self.Media = self.Instance.media_new(unicode(path))
        self.player.set_media(self.Media)
        if sys.platform.startswith('win'):
            self.player.set_hwnd(self.video_panel.GetHandle())
        elif sys.platform.startswith('linux'):
            self.player.set_xwindow(self.video_panel.GetHandle())
        else:
            self.player.set_nsobject(self.video_panel.GetHandle())

person julienj    schedule 10.06.2014    source источник
comment
Короче говоря, нет, вы не сможете сделать это так, как вы себе представляете. Каждая панель может иметь только одного родителя, и вы не можете повторно использовать панель в нескольких окнах, как вам нужно. Вам нужно будет создать отдельные панели для каждого кадра, окна или диалогового окна, которые в них нуждаются.   -  person g.d.d.c    schedule 11.06.2014


Ответы (1)


Вы не можете сделать это в wxPython. У каждого виджета есть один родитель. Я думаю, что лучше всего было бы создать подкласс wx.Panel и создать экземпляр класса для обоих фреймов. Затем вы можете использовать pubsub для связи между двумя фреймами. Я не думаю, что вы сможете точно синхронизировать оба экземпляра, но вы должны быть в состоянии сделать это довольно близко.

person Mike Driscoll    schedule 11.06.2014