Обновить текстовый виджет Tkinter по мере его написания, а не после завершения класса

Я в затруднении, так как это пишется на секретной машине, я не могу скопировать + вставить сюда. Поскольку я новичок, мой подход, вероятно, неортодоксален.

У меня есть графический интерфейс, написанный на Tkinter, с несколькими кнопками. Каждая кнопка связана с классом, который, по сути, запускает короткий сценарий. При нажатии кнопки я инициализирую класс log_window , который является просто текстовым виджетом Tkinter. Затем я создаю глобальную переменную, связывающую журнал с log_window , который я только что создал, и во время выполнения скрипта я передаю канал sys.stdout / stderr в журнал . (специально для этого я создал метод записи). Все кошерно, за исключением того, что текстовый виджет log_window не обновляется с помощью моего конвейерного stdout до тех пор, пока не завершится его вызов класса. Однако, если я просто напечатаю внутри класса, он будет печатать в том порядке, в котором он вызывается.

Пример

import Tkinter
from Tkinter import *
import time

class log_window:
    def __init__(self,master):
        self.textframe = Tkinter.Frame(master)
        self.text = Text(self.textframe)
        self.text.pack()
        self.textframe.pack()
    def write(self,text):
        self.text.insert(END,text)

class some_func1: # This effectively waits 5 seconds then prints both lines at once
    def __init__(self,master):
        log.write("some text")
        time.sleep(5)
        log.write("some text")

class some_func2: # This prints the first object, waits 5 seconds, then prints the second
    def __init__(self,master):
        print "some text"
        time.sleep(5)
        print "some text"

if __name__ == '__main__':
    global log    
    root = Tk()
    log = log_window(root)
    root.after(100,some_func1, root)
    root.after(100,some_func2, root)
    root.mainloop()

Извините, если мой пример немного невнятный, но я думаю, что он имеет смысл . Я использую конвейер через Popen и некоторые системные вызовы, но они не являются частью проблемы, поэтому я выделил только то, что, как я полагаю, является ЖК-дисплеем проблемы.

5
задан Thomas K 5 July 2011 в 21:13
поделиться