2016-08-02 9 views
0

Ich benutze wxpython 2.8, die Dinge etwas schwieriger machen können.Toolbar Tool - Bitmap toggle

Ich versuche, eine Schaltfläche in der Symbolleiste zu erstellen, die einfach ihre Bitmap ändert, wenn es umgeschaltet wird. Jedes Mal, wenn sich der Schalter ändert, ändert sich das Bitmaps in das entsprechende Symbol.

als diese Fähigkeit Sieht nicht eingebaut zu sein scheint, und ich will nicht meine Kontrollen zu eng mit meinen Ansichten mischen, versuchte ich schnell diese:

class ToggleToolBarBase(wx.ToolBarToolBase): 
    """A ToolBar Button with bitmaps which is meant to be toggled.""" 

    def __init__(self, tbar=None, toolid=wx.ID_SEPARATOR, label="", 
       bmpOff=wx.NullBitmap, bmpOn=wx.NullBitmap, 
       kind=wx.ITEM_NORMAL, clientData=None, 
       shortHelpString="", longHelpString=""): 
     # super(ToggleToolBarBase, self).__init__(self, tbar, toolid, label, 
     #           bmpOff, bmpOn, 
     #           kind, clientData, 
     #           shortHelpString, 
     #           longHelpString) 
     # Which constructor can I use? 
     super(ToggleToolBarBase, self).__init__() 
     self.tbar = tbar 
     self.bmpOff = bmpOff 
     self.bmpOn = bmpOn 
     self.toggle = False 

    def Toggle(self): 
     super(ToggleToolBarBase, self).Toggle() 
     self.toggle = not self.toggle 

    @property 
    def toggle(self): 
     return self._toggle 

    @toggle.setter 
    def toggle(self, value): 
     self._toggle = value 
     if value is False: 
      self.SetNormalBitmap(self.bmpOff) 
     elif value is True: 
      self.SetNormalBitmap(self.bmpOn) 
     self.tbar.Realize() 
     self.tbar.Refresh() 

All toolbar.AddLabelTool() Funktionen zurückgeben ToolBarToolBase, also dachte ich, ich könnte es einfach erweitern, aber keine Konstruktoren arbeiten und es sieht aus wie es ist nur ein Proxy für die C++ - Klasse.

Ich habe ein paar andere Methoden versucht, aber nichts scheint richtig zu funktionieren. Sicherlich muss es eine einfache Lösung geben. Ich kann mir vorstellen, dass dies ziemlich oft umgesetzt wird.

Antwort

1

Sie haben Recht, die ToolBarToolBase ist nicht für die Verwendung als Teil der öffentlichen API vorgesehen. Es handelt sich eher um eine intern verwendete Klasse, die Sie nur eingeschränkt verwenden können, um Informationen zum Symbolleistenelement zu erhalten. Was von den Add-Tool-Methoden zurückgegeben wird, ist eine plattformspezifische abgeleitete Klasse, die die wx-Klasse bei der Interaktion mit dem nativen Toolbar-Widget unterstützt.

Um Bitmaps zu ändern, wenn ein Umschaltwerkzeug (kind=wx.ITEM_CHECK) verwendet wird, müssen Sie die Bilder im Event-Handler, der beim Klicken auf das Tool aufgerufen wird, selbst austauschen. Sie können so etwas wie theToolBar.SetToolNormalBitmap(id, new_bmp) verwenden Sie müssen wahrscheinlich erneut auf mindestens einigen der Plattformen theToolBar.Realize() aufrufen, um die Symbolleiste das neue Image zu nehmen.