Справка панели инструментов 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)
Еще одна вещь, на которую стоит обратить внимание, - это то, что часто документы wxWidgets намного проще перемещать и расшифровывать.