focus auf fenster / kontrollierte eingabe

Plattformunabhängige GUIs mit wxWidgets.
Antworten
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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?
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

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^^
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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.
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

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
Antworten