Я в затруднении, так как это пишется на секретной машине, я не могу скопировать + вставить здесьБудучи новичком, мой подход, вероятно, неортодоксален.
У меня есть графический интерфейс, написанный на Tkinter, с несколькими кнопками.Каждая кнопка связана с классом, который, по сути, запускает короткий скрипт.Когда кнопка нажата, я запускаю класс log_window
, который является просто текстовым виджетом Tkinter.Затем я создаю глобальную переменную, связывающую log
с только что созданным log_window
, и когда скрипт запускается, я передаю sys.stdout/stderr
в log
(специально для этого я создал метод записи).Все является кошерным, за исключением того, что текстовый виджет log_window
не обновляется с моим piped stdout до тех пор, пока не вызовет вызов класса.Однако, если я просто print
внутри класса, он напечатает в том порядке, в котором он называется.
Пример
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
и некоторые системные вызовы, но они не являются частью проблемы, поэтому я только выделил то, что, как я полагаю, является ЖК-дисплеем проблемы.