2010-10-19 15 views
6

Sto usando il cursore per aggiornare la mia visualizzazione, ma il comando updateValue viene inviato ogni volta che sposto il cursore del cursore, anche per valori intermedi.TkInter, slider: come attivare l'evento solo quando l'iterazione è completa?

Invece voglio attivarlo solo quando rilascio il pulsante del mouse e l'interazione è completa.

self.slider = tk.Scale(self.leftFrame, from_=0, to=256, orient=tk.HORIZONTAL, command=updateValue) 

Come posso attivare la funzione una sola volta, al termine dell'interazione?

risposta

4

Non è possibile.

Ciò che si può fare è che il comando può ritardare qualsiasi lavoro reale per un breve periodo di tempo utilizzando 'dopo'. Ogni volta che viene richiamato il comando, annullare qualsiasi lavoro in sospeso e riprogrammare il lavoro. A seconda di quali sono i tuoi requisiti effettivi, un ritardo di mezzo secondo potrebbe essere sufficiente.

Un'altra scelta è quella di non utilizzare la funzione di comando integrata e utilizzare invece i collegamenti personalizzati. Questo può essere molto impegnativo per avere esattamente ragione, ma se hai davvero bisogno di un controllo a grana fine puoi farlo. Non dimenticare che si può interagire con il widget usando la tastiera oltre al mouse.

Ecco un breve esempio che mostra come pianificare il lavoro da fare in mezzo secondo:

import Tkinter as tk 

#create window & frames 
class App: 
    def __init__(self): 
     self.root = tk.Tk() 
     self._job = None 
     self.slider = tk.Scale(self.root, from_=0, to=256, 
           orient="horizontal", 
           command=self.updateValue) 
     self.slider.pack() 
     self.root.mainloop() 

    def updateValue(self, event): 
     if self._job: 
      self.root.after_cancel(self._job) 
     self._job = self.root.after(500, self._do_something) 

    def _do_something(self): 
     self._job = None 
     print "new value:", self.slider.get() 

app=App() 
+0

Ok, qual è il modo migliore per ottenere un ritardo di 0,5? – aneuryzm

+0

@Patric: ho modificato la risposta per includere un esempio –

+0

Grazie, ho ricevuto questo errore: AttributeError: l'oggetto 'str' non ha attributo '_job' – aneuryzm

16

Questo è piuttosto un antico domanda ora, ma nel caso qualcuno si imbatte in questo particolare problema basta utilizzare il bind() e l'evento "ButtonRelease-1" in questo modo:

import Tkinter as tk 

class App: 
    def __init__(self): 
     self.root = tk.Tk() 

     self.slider = tk.Scale(self.root, from_=0, to=256, 
           orient="horizontal") 
     self.slider.bind("<ButtonRelease-1>", self.updateValue) 
     self.slider.pack() 
     self.root.mainloop() 

    def updateValue(self, event): 
     print self.slider.get() 

app=App() 

Spero che questo aiuti chiunque!

+0

So che questa è una risposta a una domanda encient, ma era esattamente la risposta che stavo cercando. Grazie. – mhourdakis

+2

Attenzione! Se Scale.takefocus è True, le persone saranno in grado di spostare il cursore usando solo i tasti freccia della tastiera. ** Ma non accadrà mai nulla ** perché stai solo prendendo il mouse. Per rimediare, premete anche i tasti premuti. (È possibile associare più eventi per una singola richiamata) – AneesAhmed777

Problemi correlati