Tastatursteuerung

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Slevin
User
Beiträge: 5
Registriert: Sonntag 26. August 2012, 21:54

Hallo,
ich bin Python Anfänger und habe einen fertigen Quellcode in wxPython vorliegen. Es gibt hier ein Panel mit diversen Eingabemöglichkeiten sowie 2 Buttons: "OK" und "Abbrechen". Nun soll beim Drücken der Enter-Taste der "OK"-Button ausgeführt werden (es sei denn, es wurde mit TAB bis zu "Abbrechen" durchgetab-t). Im Moment passiert beim Drücken von Enter (ohne vorheriges Tabben) einfach gar nichts.
Hier der zugehörige Quellcode:

Code: Alles auswählen

        bsButtons = wx.BoxSizer(wx.HORIZONTAL)
        self.cmdOk = wx.Button(self, label=_(u"Ok"))
        self.cmdOk.Bind(wx.EVT_BUTTON, self.OnOk)
        bsButtons.Add(self.cmdOk,
                      border=4,
                      flag=wx.RIGHT)
        self.cmdCancel = wx.Button(self, label=_(u"Abbrechen"))
        self.cmdCancel.Bind(wx.EVT_BUTTON, self.OnCancel)
        bsButtons.Add(self.cmdCancel)

...

    def OnOk(self, event):
        self.EndModal(wx.ID_OK)
    def OnCancel(self, event):
        self.EndModal(wx.ID_CANCEL)
Habe schon gesehen, dass es diese Funktionen gibt:
def set_default(self.EndModal()
def set_default_response()
Weiß aber nicht wie man diese verwenden muss.

Edit:
Anhand dieser Seite http://wiki.wxpython.org/wxPython%20Style%20Guide habe ich es auch mit der Zeile

Code: Alles auswählen

self.cmdOk.SetDefault()
probiert, aber das klappt schonmal nicht (allerdings kommt auch keine Fehlermeldung)
Zuletzt geändert von Anonymous am Samstag 8. September 2012, 15:34, insgesamt 1-mal geändert.
Grund: Syntaxhervorherbung aktiviert
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Hallo Slevin,
nur um ganz sicher zu gehen, hat "dein" Programm überhaupt den "Fokus"? Sprich du startest dein Programm drückst direkt Return und nichts passiert? Wenn du durchtabst, dann hast du ja zumindest z.B. mal mit der Maus ins Fenster geklickt und dann zu den Buttons getabbt? Was passiert, wenn du nach Start irgendwo auf dein Fenster mit der Maus klickst und dann Return drückst, dass sollte aber kein Eingabefeld sein...wird dann auf ein Return reagiert? Wenn dein Programm nicht den "Fokus" hat, dann passiert nach Return auch nichts.
Viele Grüße
Piet Lotus
Slevin
User
Beiträge: 5
Registriert: Sonntag 26. August 2012, 21:54

Hallo,
ja, das Programm (es handelt sich übrigens um ein Panel) hat den Fokus: Dieser liegt auf einer edit line. Genauer gesagt: Beim Starten des Panels ist die Edit Line markiert und ich kann direkt (ohne "reinklicken") Zahl/Text eingeben, welcher in der edit line erscheint. Der Fokus soll auch genau da (auf der edit line) bleiben, sodass man direkt beim Öffnen des Panels eine Zahl eingeben kann. Trotzdem soll beim Drücken von "Enter" der OK-Button ausgeführt werden* (also ohne Fokus auf diesen).
Ich bin mittlerweile soweit fortgeschritten:

Code: Alles auswählen

self.Bind(wx.EVT_KEY_DOWN, self.on_key_down)

    def on_key_down(self, event):
        if event.GetKeyCode() == wx.WXK_RETURN:
            self.EndModal(wx.ID_OK)
        else:
            event.Skip()
In der "Bind"-Zeile fehlt noch etwas: Laut Vorlage müsste das ja eig. so aussehen:

Code: Alles auswählen

self.button.Bind(wx.EVT_BUTTON, self.OnButton)
Ich frage mich nur, was in meinem Fall dieses "button" sein soll (bzw. was das allgemein bedeutet).

-----
* also der Button muss nicht "geklickt" werden, es soll aber das gleiche passieren wie wenn man auf den Button klickt, nämlich: self.EndModal(wx.ID_OK)
Slevin
User
Beiträge: 5
Registriert: Sonntag 26. August 2012, 21:54

Hab's hinbekommen:

Code: Alles auswählen

self.etcFormula.Bind(wx.EVT_KEY_DOWN, self.on_key_down)
"etcFormula" ist die edit line von der ich gesprochen habe. Ich habe jetzt erst verstanden, dass ich mich auf diese edit line beziehen muss, wenn ich den Tastendruck abfangen will (bzw. der Tastendruck wird auch NUR dann abgefangen & übergeben, wenn der Fokus auf der edit line liegt)
Antworten