Tastaturbinding unter Linux

Fragen zu Tkinter.
Antworten
Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

Hallo Zusammen,

ich folge den tkinter Übungen aus einem Buch. Nun komme ich zum Problem das Python3 unter Linux nicht richtig mit Sonderzeichen umgehen kann. Also bei Tastaturereignissen.

Bis zu e.bind("<p>", kev) funktioniert es wunderbar, dannach laufe ich in folgenden Fehler:
Traceback (most recent call last):
File "ex17-keys.py", line 20, in <module>
e.bind("<+>",kev)
File "/usr/lib/python3.2/tkinter/__init__.py", line 977, in bind
return self._bind(('bind', self._w), sequence, func, add)
File "/usr/lib/python3.2/tkinter/__init__.py", line 932, in _bind
self.tk.call(what + (sequence, cmd))
_tkinter.TclError: bad event type or keysym "+"
Ersetze ich das "+" durch einen Buchstaben funktioniert es wieder.

Hat mir hier jemand einen Tipp ?

Gruss, Kev

Code: Alles auswählen

import tkinter

def ende():
    main.destroy()

#def kev(e):
    #lbanz["text"] = "Zeichen:" + e.char + ", Beschreibung:" + e.keysym + ",codezahl: " + str(e.keycode)

def kev(e):
        lbanz["text"] = "Zeichen:" + e.char \
        + ", Beschreibung: " + e.keysym \
        + ", Codezahl: " + str(e.keycode)

main = tkinter.Tk()

#key events

e = tkinter.Entry(main)
e.bind("<p>",kev)
e.bind("<+>",kev)
e.bind("<%>",kev)
e.bind("<,>",kev)
e.pack()

#hilfelabel
lbhlp = tkinter.Label(main, text="taste: p oder + oder % oder ,", width=40)
lbhlp.pack()

#anzeigelabel 

lbanz = tkinter.Label(main)
lbanz.pack()

#ende button
bende = tkinter.Button(main, text = "ende", command = ende)
bende.pack()

main.mainloop()

nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Du benutzt "bind" falsch. Schau dir am besten mal den Abschnitt "Event Formats" von dieser Seite an.
Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

Dann müsste es eigentlich so aussehen:

Code: Alles auswählen

e.bind("p",kev)
e.bind("+",kev)
e.bind("%",kev)
e.bind(",",kev)
wie würde ich zb nach "<" abfragen :) ?
BlackJack

@kevind: Das steht auch in der verlinkten Dokumentation.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Wenn du "<" einfangen willst, brauchst du "<Key>" als Event und im Handler fragst du den "char" des Events ab:

Code: Alles auswählen

import tkinter

def foo(event):
    if event.char == "<":
        print("pressed")


if __name__ == '__main__':
    root = tkinter.Tk()
    e = tkinter.Entry(root)
    e.bind("<Key>", foo)
    e.pack()
    root.mainloop()
BlackJack

@nomnom: Oder man nimmt für die '<'-Taste einfach den Wert der diese Taste erkennt und in der Dokumentation steht. Dann muss man '<' im Handler nicht gesondert behandeln.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

BlackJack hat geschrieben:@nomnom: Oder man nimmt für die '<'-Taste einfach den Wert der diese Taste erkennt und in der Dokumentation steht. Dann muss man '<' im Handler nicht gesondert behandeln.
Das ist wohl besser, auch wenn eine magische Zahl zum Einsatz kommt. ;)
BlackJack

@nomnom: Welche magische Zahl?
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

BlackJack hat geschrieben:@nomnom: Welche magische Zahl?
Hm, keine Ahnung. Ich denke mal, du meintest ursprünglich "<Key-<>"? Habe leider selber nicht ganz die Dokumentation gelesen. Tut mir leid!
BlackJack

@nomnom: Ich meinte '<less>'.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

BlackJack hat geschrieben:@nomnom: Ich meinte '<less>'.
Ach das hab ich ja ganz außer Acht gelassen! Manchmal sieht man den Wald vor lauter Bäumen nicht. :)
Antworten