2009-05-01 13 views
7

Napisałem następującą klasę do produkcji "monitorowania" wyjścia w dodatkowym oknie.Jak przewijać automatycznie w oknie wiadomości Tkinter

  1. Niestety, nie przesuwa się automatycznie w dół do najnowszej linii. Co jest nie tak?
  2. Jak również mam problemy z Tkinter i ipython: jak wyglądałoby równoważne wdrożenie z qt4?

Oto kod:

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() 

Zastosowanie:

Monitor.write("Hello World!") 

Odpowiedz

26

Dodaj oświadczenie cls.text.see(Tkinter.END) tuż po jednym wywołującego wkładkę.

+2

Rozważ użyteczność podczas wykonywania tej czynności. Na przykład, jeśli użytkownik przewinął kopię zapasową od dołu, aby spojrzeć na coś, czego nie chcesz automatycznie przewijać. –

3

Tym, którzy mogą chcieć spróbować oprawa:

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

Wystarczy być ostrożnym. Jak zauważył @BryanOakley, zmodyfikowane zdarzenie wirtualne jest wywoływane tylko raz, dopóki nie zostanie zresetowane. Rozważ poniżej:

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

Dlaczego mówisz, że jest zepsuty? Czy jest to udokumentowany błąd? –

+2

Czy zdajesz sobie sprawę, że '<>' uruchamia się tylko po pierwszym przejściu okna od niezmodyfikowanego do zmodyfikowanego? Nie dostaniesz ponownie zdarzenia, dopóki nie wyczyścisz flagi z '.edit_modified (True)'. –

+0

Dane: [tkdocs] (http://www.tkdocs.com/tutorial/text.html) tego nie wyjaśnia ani [effbot] (http://effbot.org/tkinterbook/text.htm), ale [tcl.tk] (http://www.tcl.tk/man/tcl8.4/TkCmd/text.htm#M72) robi, jeśli czytasz z bliska. Dostosowując odpowiedź powyżej, dziękuję! Btw, to '.edit_modified (False)' –

Powiązane problemy