Domanda

Ho scritto la seguente classe per la produzione di "monitoraggio" output in una finestra aggiuntiva.

  1. Purtroppo non scorre automaticamente fino alla riga più recente. Cosa c'è che non va?
  2. Dato che ho anche problemi con Tkinter e ipython: come sarebbe un'implementazione 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()

Utilizzo:

Monitor.write("Hello World!")
È stato utile?

Soluzione

Aggiungi un'istruzione cls.text.see (Tkinter.END) subito dopo l'inserto chiamante.

Altri suggerimenti

Per coloro che potrebbero voler provare l'associazione:

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

Stai solo attento. Come sottolineato da @BryanOakley, l'evento virtuale modificato viene chiamato solo una volta fino a quando 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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top