Voglio limitare la frequenza di un callback Tkinter è gestito

voti
1

Sto scrivendo il mio primo programma GUI con Tkinter (primo programma in Python troppo, in realtà).

Ho un widget di inserimento per la ricerca, ei risultati vado a una casella di riepilogo. Voglio che i risultati per aggiornare i tipi di utenti, così ho fatto un callback come questo:

search_field.bind(<KeyRelease>, update_results)

Il problema è che aggiorna i ricerca molte volte di fila. Dal momento che i risultati arriveranno da una query di database, che genera un sacco di traffico non necessario. Quello che voglio davvero è per per aggiornare ogni secondo o giù di lì, o di aspettare un secondo dopo che l'utente smette di digitare e quindi cercare. Qual è il modo più semplice per farlo? Grazie

UPDATE: grandi opere che per quello che ho descritto, ma ora mi sono reso conto che ho anche bisogno di innescare un aggiornamento dopo che l'utente smette di digitare. In caso contrario, gli ultimi personaggi non sono mai inclusi nella ricerca. Penso di avere a non-accettare la risposta in modo che questo per tornare alla lista delle domande ...

È pubblicato 12/07/2010 alle 21:24
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

Un bel modo per fare questo è un semplice decoratore di caching:

import time
def limit_rate( delay=1.0 ):
    """ produces a decorator that will call a function only once per `delay` """
    def wrapper( func ): # the actual decorator
        cache = dict( next = 0 ) # cache the result and time
        def limited( *args, **kwargs):
            if time.time() > cache['next']: # is it time to call again
                cache['result'] = func( *args, **kwargs) # do the function
                cache['next'] = time.time() + delay # dont call before this time
            return cache['result']
        return limited
    return wrapper

Funziona in questo modo:

@limit_rate(1.5)
def test():
    print "Called test()"
    time.sleep( 1 )
    return int(time.time())

print [test() for _ in range(5)] # test is called just once

Si potrebbe semplicemente aggiungere questo decoratore da qualche parte e decorare la vostra update_resultsfunzione con esso.

Risposto il 12/07/2010 a 21:40
fonte dall'utente

voti
0

Capito. Chiamo la funzione decorato con un ritardo utilizzando any_widget.after (delay_in_ms, funzione).

Risposto il 14/07/2010 a 04:00
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more