Справка панели инструментов wxPython

Я новичок в Python. Я пишу приложение с использованием wxPython, и в настоящее время мой код, который генерирует панель инструментов, выглядит следующим образом:

class Window(wx.Frame)
def __init__(self, parent, plot):
    wx.Frame.__init__(self, parent, wx.ID_ANY, "Name", size =(900, 600))
    self.Centre()

    self.toolbar = self.CreateToolBar(style=(wx.TB_HORZ_LAYOUT | wx.TB_TEXT))
    self.toolbar.SetToolBitmapSize((32,32))
    self.toolbar.AddLabelTool(3, '', wx.Bitmap('GUI/icons/fileopen.png'))
    self.toolbar.AddLabelTool(3, '', wx.Bitmap('GUI/icons/filesave.png'))
    self.toolbar.AddSeparator()
    self.toolbar.Realize()

Я пытаюсь немного очистить код, и я хочу, чтобы панель инструментов имела собственный класс, поэтому, когда я хочу создать панель инструментов, я просто называю это примерно так:

toolbar = Toolbar()

У меня вопрос, как его переписать, чтобы он работал так? В настоящее время мой код выглядит так:

class Toolbar():
    def __init__(self):
        self.toolbar = self.CreateToolBar(style=(wx.TB_HORZ_LAYOUT | wx.TB_TEXT))
        self.toolbar.SetToolBitmapSize((32,32))
        self.toolbar.AddLabelTool(3, '', wx.Bitmap('GUI/icons/fileopen.png'))
        self.toolbar.AddLabelTool(3, '', wx.Bitmap('GUI/icons/filesave.png'))
        self.toolbar.AddSeparator()
        self.toolbar.Realize()

Я не совсем понимаю, как работает «я». Нужно ли переписывать функцию инициализации ? Как мне это исправить? Любая помощь приветствуется. Спасибо

Ответов (2)

Решение

Вместо класса, который настраивает вашу панель инструментов, используйте функцию. Функция может быть функцией-членом вашего Window, которая является подклассом wx.Frame. Таким образом, панель инструментов будет создана из правильного окна и будет прикреплена так, как вы ожидаете.

Класс, который вы пишете выше, работал бы, если бы знал, к какому wx.Frame (ваш класс с именем Window) подключать панель инструментов. Чтобы заставить его работать, вам нужно передать объект фрейма классу создателя панели инструментов ...

class Toolbar():
  def __init__(self, frame_to_connect_to):
    frame_to_connect_to.toolbar = frame_to_connect_to.CreateToolBar(style=(wx.TB_HORZ_LAYOUT | wx.TB_TEXT))
    frame_to_connect_to.toolbar.SetToolBitmapSize((32,32))
    frame_to_connect_to.toolbar.AddLabelTool(3, '', wx.Bitmap('GUI/icons/fileopen.png'))
    frame_to_connect_to.toolbar.AddLabelTool(3, '', wx.Bitmap('GUI/icons/filesave.png'))
    frame_to_connect_to.toolbar.AddSeparator()
    frame_to_connect_to.toolbar.Realize()

Это похоже на быстрое исправление ... но на самом деле использование класса для этого - не лучшее использование классов. (Я бы даже сказал, что это неверно.)

На самом деле, что бы немного очистить, было бы просто переместить элементы панели инструментов в свою собственную функцию-член:

class Window(wx.Frame)
  def __init__(self, parent, plot):
    wx.Frame.__init__(self, parent, wx.ID_ANY, "Name", size =(900, 600))
    self.Centre()
    self._init_toolbar()

  def _init_toolbar(self):
    self.toolbar = self.CreateToolBar(style=(wx.TB_HORZ_LAYOUT | wx.TB_TEXT))
    self.toolbar.SetToolBitmapSize((32,32))
    self.toolbar.AddLabelTool(3, '', wx.Bitmap('GUI/icons/fileopen.png'))
    self.toolbar.AddLabelTool(3, '', wx.Bitmap('GUI/icons/filesave.png'))
    self.toolbar.AddSeparator()
    self.toolbar.Realize()

Вы получаете все преимущества.

да. Разбейте код wxpython на такие объекты. Его намного проще поддерживать, если вы собираетесь кодировать свой графический интерфейс вручную (я так делаю).

Вам необходимо создать подкласс wx.ToolBar (который сам является подклассом wx.ToolBarBase , и большинство функций wx.ToolBar являются производными от этого пространства имен):

class MyToolBar(wx.ToolBar):
    def __init__(self, parent, *args, **kwargs):
        wx.ToolBar.__init__(self, parent, *args, **kwargs)
        #note self here and not self.toolbar
        self.SetToolBitmapSize((32,32))
        #add other code here

Затем в вашем __init__ wx.Frame вызовите свою панель инструментов:

class MyFrame(wx.Frame):
    def __init__(self, parent, *args, **kwargs):
        wx.Frame.__init__(self, parent, *args, **kwargs)
        #note that below, self refers to the wx.Frame
        #self(wx.Frame) = parent for the toolbar constructor
        toolbar = MyToolBar(self)

Руководство по стилю wxPython

Следует также отметить, что часто по документам wxWidgets намного проще ориентироваться и расшифровывать .