2009-02-27 9 views
0

Je suis novice en Python. Je vous écris une application utilisant wxPython et je actuellement mon code qui génère une barre d'outils ressemble à ceci:Aide de la barre d'outils 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() 

Je suis en train de nettoyer un peu le code et je veux la barre d'outils d'avoir sa propre classe quand je veulent créer une barre d'outils, je l'appelle simplement quelque chose comme ceci:

toolbar = Toolbar() 

Ma question est de savoir comment puis-je réécrire si ça marche comme ça? Actuellement mon code ressemble à ceci:

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

Je ne suis pas tout à fait sûr de savoir comment fonctionne le 'self'. Dois-je réécrire la fonction init? Comment je le répare? Toute aide est grandement appréciée. Merci

Répondre

3

Au lieu d'une classe qui configure votre barre d'outils, utilisez une fonction. La fonction peut être une fonction membre de votre Window qui sous-classe wx.Frame. De cette façon, la barre d'outils sera créée à partir de la fenêtre correcte et sera attachée comme vous le souhaitez.

La classe que vous écrivez ci-dessus fonctionnerait, si elle savait quel wx.Frame (votre classe a appelé Window) pour connecter la barre d'outils. Pour obtenir de vous travailler devrait passer l'objet de cadre à la classe créateur de la barre d'outils ...

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

Il ressemble à une solution rapide ... mais vraiment en utilisant une classe pour ce faire est pas un bon usage des classes. (J'irais même jusqu'à dire qu'il était incorrect.)

Vraiment, ce qui nettoierait les choses un peu serait juste pour déplacer les choses de la barre d'outils à sa propre fonction de membre:

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

Vous obtenez tous les avantages.

1

Oui. Brisez votre code wxpython en objets comme celui-ci. C'est beaucoup plus facile à maintenir si vous allez coder votre interface graphique à la main (je le fais).

Vous devez sous-classe wx.ToolBar (qui lui-même est une sous-classe de wx.ToolBarBase, et la plupart des fonctions de wx.ToolBar sont dérivées de cet espace de noms):

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 

Ensuite, dans votre __init__ pour votre wx.Frame appelez votre barre d'outils:

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

Une autre chose à noter est que, souvent, la wxWidgets docs sont beaucoup plus faciles à naviguer et to decipher.

Questions connexes