BitmapToggleButton class

Plattformunabhängige GUIs mit wxWidgets.
Antworten
joh#
User
Beiträge: 129
Registriert: Freitag 6. November 2009, 13:16

Mittwoch 4. November 2015, 15:03

Hallo,

ich möchte eine Klasse die einen Button mit Bild drauf und eine Toggle Funktion
erzeugt:

(((wie bekomme ich den text hier richtig formatiert im BBCode?)))

Code: Alles auswählen

class BitmapToggleButton:
    """2 pic's for 2 states"""

    #----------------------------------------------------------------------
    def __init__(self, parent, filename1, filename2):
        """Constructor"""
        self.state = False

        self.image1 = wx.Image(filename1, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        self.image2 = wx.Image(filename2, wx.BITMAP_TYPE_ANY).ConvertToBitmap()

        self.button = wx.BitmapButton(parent, id=-1, bitmap=self.image1,
            pos=(10, 20), size = (self.image1.GetWidth()+5, self.image1.GetHeight()+5))
        return self.button

    def button1Click(self,event):
        """does the toggling"""
        if self.state:
            self.state = False
            self.button.SetBitmapLabel(self.image2)
        else:
            self.state = True
            self.button.SetBitmapLabel(self.image1)
        self.Refresh()
Ich hätte jetzt erwartet, daß ich diese Klasse folgendermaßen instanziieren kann:

Code: Alles auswählen

btn= BitmapToggleButton( parent, "1.gif", "2.gif")
was aber zu "TypeError: __init__() should return None" führt. Wie macht man das korrekt?

Gruß
joh
BlackJack

Mittwoch 4. November 2015, 16:29

@joh#: Die Ausnahme sagt es ja eigentlich schon sehr deutlich: `__init__()` darf nichts zurück geben. Wohin auch denn das wird ja beim erstellen eines Objekts aufgerufen und da wird dann ja grundsätzlich das Objekt zurückgegeben das mit `__init__()` initialisiert wurde. Das sind Python-Grundlagen.

Wenn Du eine BitmapToggleButton-Klasse erstellen willst die das Verhalten eines `wx.BitmapButton` verändert/erweitert, dann musst Du halt auch von dieser Klasse erben.
joh#
User
Beiträge: 129
Registriert: Freitag 6. November 2009, 13:16

Donnerstag 5. November 2015, 22:26

so ist es leider, daß es hier bei den Grundlagen ein wenig klemmt. Allerdings scheint auch schon eine Lösung
zu existieren:

Code: Alles auswählen

import wx
import wx.lib.buttons as buttons

class MyFrame(wx.Frame):
    def __init__(self, parent, title):

        wx.Frame.__init__(self, parent, wx.ID_ANY, title, size=(400, 300))
        panel = wx.Panel(self)

        b = buttons.GenBitmapToggleButton(self, -1, None)
        self.Bind(wx.EVT_BUTTON, self.OnToggleButton, b)

        bmp = wx.Image("bitmap.bmp", wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        b.SetBitmapLabel(bmp)
        b.SetBitmapSelected(bmp)
        b.SetToggle(True)
        b.Show()
        b.Refresh()

    def OnToggleButton(self):
        pass

app = wx.App()
frame = MyFrame(None, 'wx.lib.buttons Test')
frame.Show()
app.MainLoop()
Allerdings erscheint da nur ein leerer Frame.
Antworten