Справка панели инструментов 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) подключить панель инструментов. Чтобы заставить его работать, вам нужно передать объект frame в класс создателя панели инструментов...

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 намного проще перемещать и расшифровывать.

Другие вопросы по тегам