1

我有一个函数,它解析日志。我在同一个函数的不同行更新标签颜色和文本。我看到只有最后一次更改的颜色和文本只反映在 UI 中。我没有看到中间颜色和文本变化。

下面是我的代码:

def OnclickLogParser(self):
    if LogFileName == '':
        messagebox.showinfo("Error", "Please select a valid Log")
    if LogPathName == '':
        messagebox.showinfo("Error", "Please select a valid Log Path")
    self.lb_log_status.configure(bg="#08DFE8", fg="#010101", text='Parsing inProgress...')
    m_logParser = CAdpBrrLogParser()
    m_logReader = CAdpBrrLogReader('mrr', m_logParser)
    status = m_logReader.readFile(LogPathName)
    if status == True:
        self.lb_log_status.configure(bg="#F6F50B", fg="#010101", text='Log Ready')
        self.btn_log_start["state"] = "normal"
    global m_injector
    m_injector = CAdpUdpDataInjector()

您可以看到我正在更改lb_log_status两个不同位置的颜色和文本。这两条线之间的时间间隔约为 3 -5 秒。但我无法见证第一次颜色变化。'

4

1 回答 1

0

Tkinter 必须定期处理事件以执行任何 UI 操作。如果你想在这里看到颜色变化,你必须让 Tk 有机会处理重新配置小部件时生成的配置和绘制事件。您的代码会立即开始处理日志并且不会处理任何事件,直到此函数退出并且您返回到mainloop()作为事件处理方法的 Tk。如果您使用进度条小部件并尝试在处理过程中更新进度,您会看到同样的问题。

解决此问题的一种方法是使用 Tkafter()方法并将您的处理安排在每个块花费有限时间的块中。在再次读取和处理块调用after()以安排下一个块之后。

另一种方法是将处理放在工作线程上,并用于event_generate()将事件发回 Tk 线程以宣布进度和完成。

于 2021-09-08T07:26:09.073 回答