Hilfe mit Veranstaltung in Python Eintrag Widget
Frage
Ich bin einige Code in Python zu schreiben, und ich habe Probleme, wenn der Inhalt eines Eintrags Widget abzurufen versuchen. Die Sache ist die: Ich möchte die Zeichen begrenzen, die eingegeben werden können, so versuche ich, den Entry-Widget zu löschen, wenn ich die bestimmte Anzahl von Zeichen (in diesem Fall 2) erreichen, aber es sieht aus wie ich immer das letzte getippte verpassen Charakter. Ich habe den verlorenen Charakter in einem Druck zu zeigen.
Hier ist der Beispielcode:
from Tkinter import *
class sampleFrame:
def __init__(self, master):
self.__frame = Frame(master)
self.__frame.pack()
def get_frame(self):
return self.__frame
class sampleClass:
def __init__(self, master):
self.__aLabel = Label(master,text="aLabel", width=10)
self.__aLabel.pack(side=LEFT)
self.__aEntry = Entry (master, width=2)
self.__aEntry.bind('<Key>', lambda event: self.callback(event, self.__aEntry))
self.__aEntry.pack(side=LEFT)
def callback(self, event, widgetName):
self.__value = widgetName.get()+event.char
print self.__value
if len(self.__value)>2:
widgetName.delete(2,4)
root = Tk()
aSampleFrame = sampleFrame(root)
aSampleClass = sampleClass(aSampleFrame.get_frame())
root.mainloop()
Jede Hilfe wird sehr geschätzt werden!
Vielen Dank im Voraus
Lösung
Zuerst, nachdem Sie das Löschen zu tun, geht die Veranstaltung auf mit seiner normalen Verarbeitung, das heißt der Charakter wird eingeführt. Sie müssen signalisieren tkinter, dass das Ereignis ignoriert werden soll.
So in Ihrem Code oben, fügen Sie die markierte Zeile:
if len(self.__value) > 2:
widgetName.delete(2,4)
return "break" # add this line
Auf der anderen Seite, warum gehst du durch das Lambda? Ein Ereignis hat ein .widget Attribut, das Sie verwenden können. So können Sie Ihren Code in ändern:
self.__aEntry.bind('<Key>', self.callback) # ※ here!
self.__aEntry.pack(side=LEFT)
def callback(self, event):
self.__value = event.widget.get()+event.char # ※ here!
print self.__value
if len(self.__value)>2:
event.widget.delete(2,4) # ※ here!
return "break"
Alle geänderten Linien sind mit „hier!“
Andere Tipps
Um etwas genauer zu sein, Tk-Widgets haben, was „bindtags“ bezeichnet werden. Wenn ein Ereignis verarbeitet wird, wird jeder bindtag auf dem Widget, um in Betracht gezogen, um zu sehen, ob es eine Bindung hat. Ein Widget wird standardmäßig als bindtags das Widget hat, die Widget-Klasse, den Root-Widget, und „alle“. Somit Bindungen an das Widget wird, bevor die Standardbindungen auftreten. Sobald Ihre Bindung bearbeitet wurde Sie durch Rücksendung eine „Pause“ weitere bindtags aus betrachtet werden verhindern kann.
Die Auswirkungen sind dies: Wenn Sie eine Bindung auf das Widget machen, die Klasse, Root-Fenster und „alle“ Bindings können auch schießen. Darüber hinaus Bindung jeder Sie an das Widget befestigen Feuer vor die Klasse verbindlich das ist, wo das Standardverhalten (zB das Einfügen eines Zeichens) geschieht. Es ist wichtig, dass die in Situationen bewusst zu sein, in dem Sie das Ereignis nach dem Standardverhalten eher als bisher handhaben mögen.