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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top