2009-05-01 18 views
7

Escribí la siguiente clase para producir resultados de "supervisión" dentro de una ventana adicional.Cómo desplazarse automáticamente dentro de una ventana de mensaje de Tkinter

  1. Lamentablemente, no se desplaza automáticamente a la línea más reciente. ¿Qué está mal?
  2. Como también tengo problemas con Tkinter e ipython: ¿cómo sería una implementación equivalente con qt4?

Aquí está el código:

import Tkinter 
class Monitor(object): 
    @classmethod 
    def write(cls, s): 
    try: 
     cls.text.insert(Tkinter.END, str(s) + "\n") 
     cls.text.update() 
    except Tkinter.TclError, e: 
     print str(s) 
    mw = Tkinter.Tk() 
    mw.title("Message Window by my Software") 
    text = Tkinter.Text(mw, width = 80, height = 10) 
    text.pack() 

Uso:

Monitor.write("Hello World!") 

Respuesta

26

Añadir un comunicado cls.text.see(Tkinter.END) justo después de la llamada de inserción.

+2

Considerar la posibilidad de uso al hacer esto. Por ejemplo, si el usuario ha retrocedido desde la parte inferior para mirar algo que no desea desplazarse automáticamente. –

3

Para aquellos que quieran probar la unión:

def callback(): 
    text.see(END) 
    text.edit_modified(0) 
text.bind('<<Modified>>', callback) 

Sólo tenga cuidado. Como señaló @BryanOakley, el evento virtual modificado solo se llama una vez hasta que se restablece. Considere a continuación:

import Tkinter as tk 

def showEnd(event): 
    text.see(tk.END) 
    text.edit_modified(0) #IMPORTANT - or <<Modified>> will not be called later. 

if __name__ == '__main__': 

    root= tk.Tk() 

    text=tk.Text(root, wrap=tk.WORD, height=5) 
    text.insert(tk.END, "Can\nThis\nShow\nThe\nEnd\nor\nam\nI\nmissing\nsomething") 
    text.edit_modified(0) #IMPORTANT - or <<Modified>> will not be called later. 
    text.pack() 
    text.bind('<<Modified>>',showEnd) 

    button=tk.Button(text='Show End',command = lambda : text.see(tk.END)) 
    button.pack() 
    root.mainloop() 
+0

¿Por qué dices que está roto? ¿Es esto un error documentado? –

+2

¿Sabe que '<>' solo se activa una vez que la ventana pasa de no modificada a modificada? No volverás a obtener el evento hasta que borres esa bandera con '.edit_modified (True)'. –

+0

Figuras: [tkdocs] (http://www.tkdocs.com/tutorial/text.html) no explica esto, ni [effbot] (http://effbot.org/tkinterbook/text.htm), pero [tcl.tk] (http://www.tcl.tk/man/tcl8.4/TkCmd/text.htm#M72) lo hace si lee atentamente. Ajustando la respuesta de arriba, ¡gracias! Por cierto, es '.edit_modified (False)' –

Cuestiones relacionadas