2015-03-29 18 views
5

Sto lavorando con tkinter su Python 3.4.1 (Windows 7), e sto riscontrando che la funzione Entry.xview_moveto di ttk non funziona correttamente. Ecco qualche semplice codice:Perché l'Entry.xview_moveto di tkinter fallisce?

from tkinter import * 
from tkinter import ttk 

a = Tk() 
text = StringVar(a, value='qwertyuiopasdfghjklzxcvbnm1234567890') 
b = ttk.Entry(a, textvariable=text) 
b.grid() 
b.xview_moveto(1) 

La funzione xview_moveto deve scorrere il testo fino in fondo a sinistra, ma non è così. Tuttavia, ho notato che se uso

b.after(500, b.xview_moveto, 1) 

funziona perfettamente. Perché devo ritardare la chiamata di funzione perché funzioni correttamente? Sto facendo qualcosa di sbagliato?

Aggiornamento: oltre alla soluzione di fhdrsdg, ho trovato che il metodo Entry.after_idle funziona per il mio programma. Non sembra funzionare per il semplice esempio precedente, ma se qualcun altro ha lo stesso problema di me, questa potrebbe essere un'altra soluzione dall'aspetto più pulito.

risposta

2

Questo problema esiste anche in tcl/Tk.
La risposta proposta è quella di associare all'evento <Expose> della voce e di non accoppiarlo successivamente. Ho cercato di riscrivere quella di Python/Tkinter:

def xview_event_handler(e): 
    e.widget.update_idletasks() 
    e.widget.xview_moveto(1) 
    e.widget.unbind('<Expose>') 

a = Tk() 
text = StringVar(a, value='qwertyuiopasdfghjklzxcvbnm1234567890') 
b = ttk.Entry(a, textvariable=text) 
b.grid() 
b.bind('<Expose>', xview_event_handler) 

La update_idletasks sembra essere necessario when using a tcl version below 8.5.5.

+0

non è necessario chiamare 'update_idletasks' nel gestore eventi. L'unico modo in cui viene chiamato il gestore è se 'update' è appena stato eseguito. –

+0

Questo è quello che pensavo, ma quando tengo quella linea la vista non si muove per me. – fhdrsdg

+0

Interessante. Grazie per la risposta. –

Problemi correlati