Seite 1 von 1

Tastatursteuerung

Verfasst: Freitag 7. September 2012, 09:29
von Slevin
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)

Re: Tastatursteuerung

Verfasst: Freitag 7. September 2012, 20:51
von Piet Lotus
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

Re: Tastatursteuerung

Verfasst: Montag 10. September 2012, 10:37
von Slevin
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)

Re: Tastatursteuerung

Verfasst: Montag 10. September 2012, 13:17
von Slevin
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)