Справка панели инструментов wxPython - PullRequest
0 голосов
/ 27 февраля 2009

Я новичок в 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()

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

Ответы [ 2 ]

3 голосов
/ 27 февраля 2009

Вместо класса, который настраивает вашу панель инструментов, используйте функцию. Функция может быть функцией-членом вашего 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()

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

1 голос
/ 28 февраля 2009

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

Вам необходимо создать подкласс 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 намного легче ориентироваться и расшифровывать .

...