anfängerfrage

Plattformunabhängige GUIs mit wxWidgets.
Antworten
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

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"?
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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)  
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

hmm ich bekomme beim bind immer den Fehler:

AttributeError: MainWindow instance has no attribute 'Bind'
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Hast du denn die __init__ von wx.Frame aufgerufen und erbt deine Klasse von wx.Frame?
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Ich glaube er hat __init__ net aufgerufen oder die Klasse erbt nich von wx.Frame, sieht sehr danach aus, oder?
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Achja, gorba - könntest du den ersten Post dieses Threads bitte bearbeiten, und ihm einen sinnvollen Titel geben?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten