2009-05-01 11 views
7

Ich schrieb die folgende Klasse für die Erzeugung von "Überwachung" Ausgabe in einem zusätzlichen Fenster.Wie scrollt man automatisch innerhalb eines Tkinter-Nachrichtenfensters

  1. Leider scrollt es nicht automatisch bis zur letzten Zeile. Was ist falsch?
  2. Da ich auch Probleme mit Tkinter und ipython habe: Wie würde eine äquivalente Implementierung mit qt4 aussehen? Hier

ist der Code:

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

Verbrauch:

Monitor.write("Hello World!") 

Antwort

26

eine Erklärung hinzufügen cls.text.see(Tkinter.END) direkt nach der einen Aufruf Einsatz.

+2

Betrachten Sie die Benutzerfreundlichkeit, wenn Sie dies tun. Wenn der Benutzer beispielsweise von unten nach oben gescrollt wurde, um etwas anzuzeigen, das nicht automatisch gescrollt werden soll. –

3

Für diejenigen, die wollen, könnte die Bindung an versuchen:

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

Nur vorsichtig sein. Wie @BryanOakley gezeigt hat, wird das modifizierte virtuelle Ereignis nur einmal aufgerufen, bis es zurückgesetzt wird. Berücksichtigen Sie unten:

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

Warum sagst du, es ist kaputt? Ist das ein dokumentierter Fehler? –

+2

Ist Ihnen bekannt, dass '<>' nur beim ersten Mal ausgelöst wird, wenn das Fenster von nicht-modifiziert zu geändert wechselt? Sie werden das Ereignis nicht erneut erhalten, bis Sie dieses Flag mit '.edit_modified (True)' löschen. –

+0

Abbildungen: [tkdocs] (http://www.tkdocs.com/tutorial/text.html) erklärt dies nicht, noch [effbot] (http://effbot.org/tkinterbook/text.htm), aber [tcl.tk] (http://www.tcl.tk/man/tcl8.4/TkCmd/text.htm#M72) tut, wenn Sie genau lesen. Antwort oben anpassen, danke! Btw, es ist '. Edit_modified (False)' –