Seite 1 von 1

focus auf fenster / kontrollierte eingabe

Verfasst: Dienstag 10. Mai 2005, 09:13
von pr0stAta
So ich bins mal wieder. Diesmal suche ich die Lösung schon länger
und werde kaum meinen eigenen thread beantworten ^^
Habe folgendes Problem: Ich hab ein Fenster für die Eigenschaften meines Programmes. Sobald man auf einen Button klickt soll man die einzelnen Funktionen auf eine Taste binden können. Vergleichbar mit Tastaturbelegung
in PC Spielen. Nur nachdem man auf den Button klickt wird keine Tastatur eingabe registriert, erst nachdem ich noch einmal auf das Fenster an sich klicke ist dies möglich.
Quellcode Teile:

Code: Alles auswählen

  self.nextSong = wx.Button(self, -1, "Next Song", size=(125, -1))
  self.Bind(wx.EVT_BUTTON, self.openDialog, self.nextSong) 
def openDialog(self, event):
  self.getKeyText = wx.StaticText(self, -1, "Bitte wählen Sie eine Taste",   
  pos=(150,50))        
  self.Bind(wx.EVT_CHAR, self.OnKeyUp)
def OnKeyUp(self, event):
  keycode = event.GetKeyCode()
  print chr(keycode)

gibt es eine Möglichkeit den Focus auf das Fenster zu setzen?

Frage 2 :
Wie kann ich die Tastatur eingabe über keycode = event.GetKeyCode()
abbrechen nachdem eine Taste gedrückt wurde?
So, das wars :p
Gruß prosta

Re: focus auf fenster / kontrollierte eingabe

Verfasst: Dienstag 10. Mai 2005, 14:49
von Francesco
gibt es eine Möglichkeit den Focus auf das Fenster zu setzen?
Funktioniert self.getKeyText.SetFocus()?
"""
wxWindow::SetFocus
This sets the window to receive keyboard input.
"""
Frage 2 :
Wie kann ich die Tastatur eingabe über keycode = event.GetKeyCode()
abbrechen nachdem eine Taste gedrückt wurde?
Du meinst, Tastatureingaben ignorieren(?)
vielleicht self.Unbind()? oder habe ich die Frage falsch verstanden?

Verfasst: Dienstag 10. Mai 2005, 14:56
von pr0stAta
ja sowas wie unbind meine ich, aber ich möchte das nach genau einer
eingabe dieses unbind auftritt. nochmal falls es nicht deutlich war:
wenn ihr bei einem programm eine tastaturbelegung ändert und das
programm die eingabe erwartet, drückt man sicherlich ausversehen mal
2 sek auf die taste (bsp.) b. nun will ich natürlich nicht das ich 8x b drücken muss um die funktion auszuführen. daher soll nur einmal b gelogt werden.
hoffe das war verständlicher^^

Verfasst: Dienstag 10. Mai 2005, 15:12
von Francesco
und wenn du nach:
keycode = event.GetKeyCode()
self.Unbind(wx.EVT_CHAR, self.OnKeyUp)
einfügst?
Dann wird nach dem ersten keyup event das event wieder
freigegeben.

BTW:
Verwirrend finde ich evt_char mit OnKeyUp zu binden.
Ich würde die Funktion OnChar einfach nennen um es nicht mit
EVT_KEY_UP zu verwechseln.

Verfasst: Mittwoch 11. Mai 2005, 08:08
von pr0stAta
ah vielen dank :D
self.Unbind(wx.EVT_CHAR) hat funktioniert.
gibt man unbind noch die methode als parameter, kommt eine fehlermeldung, ohne die Angabe geht es aber.
zu dem funktionsnamen: ist noch ein überbleibsel aus alten zeiten. hatte
zuerst mit der funktion evt_key_up gespielt und die funktion danach nicht
mehr umbenannt
*edit* erst später ist mir aufgefallen das meine sätze der deutschen
sprache kaum würdig waren. :p