Ritardo Tkinter

Mi piacerebbe creare una finestra grafica in PyDev (Eclipse) python 2.75.

Ho fatto alcune cose, ma mi piacerebbe fare un “ingresso” “lampeggiare”. È Test dell’input dell’utente. Se è un numero intero, dovrebbe lampeggiare in verde per un secondo e poi diventare bianco. Ma se è una stringa di qualcos’altro dovrebbe lampeggiare in rosso e poi diventare bianco. Ho usato un time.sleep() ma non funziona come mi piacerebbe.

Ecco il mio codice per questa azione:

 def sprawdzam(): z = e.get() try: z = int(z) e.config(bg = 'green') time.sleep(2) e.config(bg = 'white') except: l.config(bg = 'red') time.sleep(2) e.config(bg = 'white') 

    time.sleep blocca l’esecuzione del programma.

    Usa after .

    Per esempio:

     from Tkinter import * def blink(): e.config(bg='green') e.after(1000, lambda: e.config(bg='white')) # after 1000ms root = Tk() e = Entry(root) e.pack() b = Button(root, text='blink', command=blink) b.pack() root.mainloop() 

    Prima di tutto, non dovresti usare try / except blocks per gestire il tuo codice. In secondo luogo, stai usando e.config e l.config per cambiare i colors, quale dovrebbe essere? (Dovresti considerare migliori convenzioni di denominazione per le tue variabili e oggetti per ridurre la confusione).

    Puoi controllare il tipo di object che l’utente ha inserito e quindi avere un stream gestito migliore in questo modo:

     def sprawdzam(): content = e.get() if content.isalnum(): e.config(bg = 'green') else: e.config(bg = 'red') time.sleep(2) e.config(bg = 'white') 

    Qui ho usato e come object per cambiare i colors, ma questo potrebbe non essere vero per il tuo codice, dovresti assicurarti di farlo con gli oggetti giusti.

    Come puoi vedere, il sonno e il passaggio al bianco vengono eseguiti al di fuori di if / else perché non importa cosa, dovrai aspettare di diventare bianco, non è necessario scrivere quel codice due volte.

      for P in range(len(MaxTrace)): T = P + 1 if T < len(MaxTrace): PrevPlate , PrevDot = MaxTrace[P][0], MaxTrace[P][1] TargetPlate, TargetDot = MaxTrace[T][0], MaxTrace[T][1] self.__window.update() sleep(0.3) #replace REGULAR token img to ACTIVE token img GameCanvas.itemconfig(self.tokens[PrevPlate,PrevDot],image=self.DotImgActv[RivalColor]) self.__window.update() sleep(0.2) # mark Target vacation for move to by Yellow-RING img self.tokens[TargetPlate, TargetDot]=GameCanvas.create_image(DotXY[TargetPlate,TargetDot], image=self.DotVacantImg ) self.__window.update() sleep(0.4) GameCanvas.delete(self.tokens[PrevPlate,PrevDot]) self.__window.update() sleep(0.3) GameCanvas.itemconfig(self.tokens[TargetPlate, TargetDot],image=self.DotImg[RivalColor])