Domanda

Sto scrivendo del codice in Python e ho problemi durante il tentativo di recuperare il contenuto di un widget Voce. Il fatto è: voglio limitare i caratteri che possono essere digitati, quindi sto cercando di cancellare il widget Voce quando raggiungo il numero specifico di caratteri (2 in questo caso), ma sembra che mi manchi sempre l'ultimo digitato personaggio. Ho aggiunto il personaggio perso in una stampa da mostrare.

Ecco il codice di esempio:

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()

Qualsiasi aiuto sarà molto apprezzato!

Grazie in anticipo

È stato utile?

Soluzione

All'inizio, dopo aver fatto la cancellazione, l'evento continua con la sua normale elaborazione, cioè il personaggio viene inserito. Devi segnalare a Tkinter che l'evento deve essere ignorato.

Quindi nel tuo codice sopra, aggiungi la linea contrassegnata:

if len(self.__value) > 2:
    widgetName.delete(2,4)
    return "break" # add this line

D'altra parte, perché passi attraverso la lambda? Un evento ha un attributo .widget che puoi usare. Quindi puoi cambiare il tuo codice in:

    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"

Tutte le righe modificate sono contrassegnate con " qui! "

Altri suggerimenti

Per essere un po 'più specifici, i widget di Tk hanno quelli che sono chiamati "quotazioni". Quando viene elaborato un evento, ogni bindtag sul widget viene considerato per vedere se ha un'associazione. Un widget per impostazione predefinita avrà come bind tag il widget, la classe widget, il widget radice e " tutto " ;. Pertanto, i collegamenti al widget si verificheranno prima dei collegamenti predefiniti. Una volta che la tua associazione è stata elaborata, puoi impedire che vengano presi in considerazione ulteriori bindtags restituendo una "pausa".

Le ramificazioni sono queste: se si effettua un'associazione sul widget, la classe, la finestra principale e " tutto " anche gli attacchi possono sparare. Inoltre, qualsiasi associazione allegata al widget genera prima l'associazione di classe che è dove si verifica il comportamento predefinito (ad es. L'inserimento di un carattere). È importante essere consapevoli di ciò nelle situazioni in cui potresti voler gestire l'evento dopo il comportamento predefinito piuttosto che prima.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top