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?