Я в затруднении, так как это пишется на секретной машине, я не могу скопировать + вставить сюда. Поскольку я новичок, мой подход, вероятно, неортодоксален.
У меня есть графический интерфейс, написанный на 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
и некоторые системные вызовы, но они не являются частью проблемы, поэтому я выделил только то, что, как я полагаю, является ЖК-дисплеем проблемы.