Python 日志记录命令不能实时工作



我在 Tkinter 中有一个日志记录小部件(滚动文本(,其中包含一个处理日志并在小部件中打印主题的TextHandler

class TextHandler(logging.Handler):
    def __init__(self, text):
        # run the regular Handler __init__
        logging.Handler.__init__(self)
        # Store a reference to the Text it will log to
        self.text = text
    def emit(self, record):
        msg = self.format(record)
        def append():
            self.text.configure(state='normal')
            self.text.insert(Tkinter.END, msg + 'n')
            self.text.configure(state='disabled')
            # Autoscroll to the bottom
            self.text.yview(Tkinter.END)
        self.text.after(0, append)

st = ScrolledText.ScrolledText(self, width=190, height=9, state='disabled')
st.configure(font='TkFixedFont')
st.place(x=0, y=539)
text_handler = TextHandler(st)
# Logging configuration
logging.basicConfig(filename='test.log',
                            level=logging.INFO,
                            format='%(asctime)s - %(levelname)s - %(message)s')
# Add the handler to logger
self.logger = logging.getLogger()
self.logger.addHandler(text_handler)

并调用logging.info(msg)以获取日志消息。 但是有一个问题。 一切都运行良好,但是当在进程之前调用此函数时(例如某些函数适用于列表(,我的日志会出现在那之后!

logging.info("message")
print "message"
for topic in news:
    ...

print方法在这里工作正常,但logging有问题. 我在循环结束后有我的日志消息。
所以。。。问题出在哪里?

你不应该使用 after(0, ...) .我不确定这是否是唯一的问题,但这绝对是一个问题。您正在耗尽事件处理程序 - "空闲"队列永远不会清空,因此它没有机会为正常事件提供服务。实际上,你已经创建了一个无限循环。

您应该提供一个较小的非零间隔,这将有助于解决此问题。

最新更新