2009-05-01 9 views
7

Ho scritto la seguente classe per produrre l'output di "monitoraggio" all'interno di una finestra aggiuntiva.Come scorrere automaticamente all'interno di una finestra dei messaggi di Tkinter

  1. Sfortunatamente non scorre automaticamente verso il basso fino alla riga più recente. Che c'è?
  2. Come anche io ho problemi con Tkinter e ipython: come sarebbe un'attuazione equivalente con qt4?

Ecco il codice:

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

Usage:

Monitor.write("Hello World!") 

risposta

26

aggiungere un'istruzione cls.text.see(Tkinter.END) subito dopo quella chiamando inserto.

+2

Considerare l'usabilità quando si esegue questa operazione. Ad esempio, se l'utente ha fatto scorrere indietro dal basso per guardare qualcosa che non vuoi scorrere automaticamente. –

3

Per chi volesse provare vincolante:

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

Basta stare attenti. Come sottolineato da @BryanOakley, l'evento virtuale Modificato viene richiamato solo una volta finché non viene ripristinato. Considerare di seguito:

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

Perché dici che è rotto? È un bug documentato? –

+2

Sei consapevole che '<>' si attiva solo una volta la prima volta che la finestra passa da non modificata a modificata? Non otterrai di nuovo l'evento finché non cancelli quella bandiera con '.edit_modified (True)'. –

+0

Figure: [tkdocs] (http://www.tkdocs.com/tutorial/text.html) non spiega questo, né [effbot] (http://effbot.org/tkinterbook/text.htm), ma [tcl.tk] (http://www.tcl.tk/man/tcl8.4/TkCmd/text.htm#M72) lo fa se leggi attentamente. Aggiustando la risposta sopra, grazie! A proposito, è '.edit_modified (False)' –

Problemi correlati