0

我是 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函数吗?我如何解决它?任何帮助是极大的赞赏。谢谢

4

2 回答 2

3

不要使用设置工具栏的类,而是使用函数。该函数可以是子类 wx.Frame 的 Window 的成员函数。这样,工具栏将从正确的窗口创建,并以您期望的方式附加。

如果您在上面编写的类知道将工具栏连接到哪个 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()

你得到所有的好处。

于 2009-02-27T19:52:14.657 回答
1

是的。将你的 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 文档通常更容易导航和破译

于 2009-02-28T15:04:55.087 回答