2009-02-27 8 views
0

私はPythonを初めて使用しています。私はwxPythonのを使用してアプリケーションを書いていますし、私は現在、ツールバーを作成する私のコードは次のようになります。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関数を書き直す必要がありますか?どうすれば修正できますか?どんな助けでも大歓迎です。ありがとう

答えて

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() 

あなたはすべての利点を得る。

1

はい。あなたのwxpythonコードをこのようなオブジェクトに分割します。 GUIを手作業でコーディングする場合は、維持する方がはるかに簡単です(私はそうします)。あなたの呼び出しあなたのwx.Frameのためにあなたの__init__に続いて

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 

:あなたはwx.ToolBarを(それ自体がwx.ToolBarBaseのサブクラスであり、かつwx.ToolBarの機能のほとんどは、その名前空間に由来している)サブクラス化する必要がある

ツールバー:

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 Style Guide

注意すべきもう一つは、そのことが多いですwxWidgets docsはナビゲートがずっと簡単でto decipherです。