/ / Wie beende ich ein Tastaturereignis in Tkinter? - Python, Tkinter, Tastatur

Wie beende ich ein Tastaturereignis in Tkinter? - Python, Tkinter, Tastatur

Ich möchte einen Tastaturbefehl für die schnelle Bedienung. Wenn ich "b" drücke, drucke "b"; und wenn ich "s" drücke, drucke "s". Hier ist mein Code:

# -*- coding: utf-8 -*-
from Tkinter import *
import tkFont

root = Tk()

def pri(event):
print event.char

def rb():
root.bind("<KeyPress-b>",pri)
root.bind("<KeyPress-s>",pri)

v = IntVar()
def callbackcheck():
if v.get():
rb()
Cb = Checkbutton(root,variable = v,text = "Hello",onvalue = 1,offvalue  = 0,command = callbackcheck)
Cb.pack()

root.mainloop()

Wenn ich den Checkbutton auf "Ein" setze, ist das Tastaturereignisaktiviert. Aber wenn ich den Checkbutton auf "Aus" setze, kann das Tastaturereignis nicht beendet werden und wenn ich "b" drücke, wird weiterhin "b" gedruckt. Eigentlich wird das Tastaturereignis immer ausgeführt, sobald es aktiviert wurde Tastaturereignis beenden. Haben Sie irgendwelche Ideen?

Als nächstes ist eine ähnliche Frage: Wenn ich Eingabe in Tkinter verwende, möchte ich nur Zahlen eingeben, nicht Buchstaben, und finde einen Weg, es zu verwenden validateCommandAber ich kann das Eingabe-Widget nicht beenden, wenn ich auf einen anderen Bereich im aktuellen Fenster klicke oder Buchstaben eingebe.

Antworten:

1 für die Antwort № 1

Sie sollten die Bindung mit entfernen unbind() wenn Sie den Checkbutton auf "off" setzen.

if v.get():
rb()
else:
root.unbind("<KeyPress-b>")
root.unbind("<KeyPress-s>")

2 für die Antwort № 2

BEARBEITET

Wie Zetys hervorhebt, müssen Sie die Tastenkombinations-Kombination lösen. Basierend auf Ihrem Code:

# -*- coding: utf-8 -*-
from Tkinter import *
import tkFont

root = Tk()

def pri(event):
print (event.char)

def rb():
if v.get():
root.bind("<KeyPress-b>",pri)
root.bind("<KeyPress-s>",pri)
else:
root.unbind("<KeyPress-b>")
root.unbind("<KeyPress-s>")

v = BooleanVar()

Cb = Checkbutton(root,variable = v,text = "Hello", command = rb)
Cb.pack()

root.mainloop()

Ich habe ein paar Dinge geändert:

  • Ich habe Callbackcheck gelöscht (rb macht jetzt den Trick)
  • Ich habe die IntVar in BooleanVar geändert, sodass sie entweder "True" oder "False" ist (keine Notwendigkeit, onvalue und offvalue explizit aufzurufen).