Seite 1 von 1

anfängerfrage

Verfasst: Dienstag 30. Januar 2007, 12:29
von gorba
Hab gerade mit wx Python angefangen und wollte fragen was nun der unterschied ist zwischen:

Code: Alles auswählen

b = wx.Button(self, 10, "Default Button", (20, 20))
self.Bind(wx.EVT_BUTTON, self.OnClick, b)
und

Code: Alles auswählen

button = wx.Button(self, ID_BUTTON+i, "&"+`i`)
wx.EVT_BUTTON(self, ID_BUTTON+3, self.OnBu3)
Wieso kann man das auf 2 arten machen?
Ausserdem, ist es möglich einen button auf einen event anzusetzen, der nich ein ganzer klick ist sondern nur das "runterdrüken"?

Re: anfängerfrage

Verfasst: Dienstag 30. Januar 2007, 12:45
von sape
gorba hat geschrieben:[...] nun der unterschied ist zwischen:[...]
Das erste ist Pythonischer.

gorba hat geschrieben:[...]
Wieso kann man das auf 2 arten machen?[...]
Mal mein Interpretationsversuch. In C (in dem wxWidget geschrieben ist) wird ein event binding, an ein Widget, mit wx.EVT_XYZ gemacht. Die sind dort als Makros (#define EVT_...) definiert. Die Entwickler von wxPython habe sich wohl einfach gedacht, das die das mit übernehmen, das es Bestandteil von wxWidget ist. Da das aber total Unpythonisch ist (Wie vieles andere [1]), haben die ``Bind`` mit hinzugefügt. Intern macht ``Bind`` (Schätze ich mal) einfach ein ``wx.EVT_XYZ(...)`` daraus.

[1] Z.B. das spiel mit den ``id``s. Ist in neuern wxPython Versionen nicht mehr nötig; Außer in wenigen Ausnahmefällen wie z.B. bei der Benutzung von ``wx.AcceleratorTable`` wo man für die definierten ``accel``s immer ncoh ids braucht, damit man eine klare Zuordnung beim binding hat.

Z.B.:

Code: Alles auswählen

        acell_id1 = wx.NewId()
        accel = wx.AcceleratorTable([
            # Applikation beenden
            (wx.ACCEL_CTRL, wx.WXK_F4, acell_id1),
            (wx.ACCEL_CTRL, ord('Q'), acell_id1)
        ])
        self.SetAcceleratorTable(accel)
        self.Bind(wx.EVT_MENU, self.OnAppClose, id=acell_id1)
lg

Verfasst: Dienstag 30. Januar 2007, 12:47
von sape
EDIT:

Übrigens, die ID brauchst du nicht. -1 reicht auch, dann wird automatisch eine freie vergeben.

So geht es auch.

Code: Alles auswählen

b = wx.Button(self, -1, "Default Button", (20, 20))
self.Bind(wx.EVT_BUTTON, self.OnClick, b)  

Verfasst: Dienstag 30. Januar 2007, 13:44
von gorba
hmm ich bekomme beim bind immer den Fehler:

AttributeError: MainWindow instance has no attribute 'Bind'

Verfasst: Dienstag 30. Januar 2007, 14:06
von name
Hast du denn die __init__ von wx.Frame aufgerufen und erbt deine Klasse von wx.Frame?

Verfasst: Mittwoch 31. Januar 2007, 14:02
von sape
gorba hat geschrieben:hmm ich bekomme beim bind immer den Fehler:

AttributeError: MainWindow instance has no attribute 'Bind'
Zeig mal bitte dein Code, dann kann man auch helfen.

lg

Verfasst: Mittwoch 31. Januar 2007, 14:08
von name
Ich glaube er hat __init__ net aufgerufen oder die Klasse erbt nich von wx.Frame, sieht sehr danach aus, oder?

Verfasst: Mittwoch 31. Januar 2007, 15:20
von Leonidas
Achja, gorba - könntest du den ersten Post dieses Threads bitte bearbeiten, und ihm einen sinnvollen Titel geben?