【问题标题】:Python+tkinter: Text widget doesn't change text immidiatelyPython + tkinter:文本小部件不会立即更改文本
【发布时间】:2022-01-06 15:21:58
【问题描述】:

我有一个 tk.Text() 小部件和一个按钮。单击按钮时,我想更改 Text 小部件中的文本,然后进行冗长的工作。这是按钮命令函数的代码 sn-p:

price_text.delete("1.0", tk.END)
price_text.insert(tk.END, 'PLEASE WAIT..')  
result = self.the_lengthy_job() 

但是,“请稍候..”消息在 self.the_length_job() 返回之前不会显示。是否可以在 the_length_job() 开始之前显示它?

---编辑--- 这是更多代码:

import tkinter as tk
import pandas_datareader as web

class GUI:
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry("800x480")
        self.price_text = tk.Text(self.root)
        self.price_text.grid(row=0, column=0, )

        tk.Button(self.root, text="Get", command=self.do_get).grid(row=1, column=0)
        self.root.mainloop()

    def do_get(self):
        self.price_text.delete("1.0", tk.END)
        self.price_text.insert(tk.END, "PLEASE WAIT..")
        result = self.lengthy_job()

    def lengthy_job(self):
        tickers = ["GOOG", "AAPL", "MSFT", "IBM", "F", "AMZN", "NVDA", "NFLX", "DISH", "BABA", "JD", "SHOP", "PDD", "CSCO", "AMD", "INTC", "TXN", "MU", "QCOM"]
        return web.DataReader(tickers, 'yahoo', start="2020-1-1", end="2020-1-31")

GUI()

在本例中,“PLEASE WAIT..”仅在 longy_job() 完成后显示。

【问题讨论】:

  • 请向我们展示更多代码
  • 您需要在将文本插入文本小部件后立即调用self.root.update()
  • @SylvesterKruin 感谢您的建议。还注意到self.price_text.update() 可以做同样的工作。如果你把它放在答案中,我会接受它。
  • 请不要从您的问题中删除完整的代码;理解问题很重要。

标签: python tkinter


【解决方案1】:

这里的问题是插入文本后窗口没有更新。这是因为事件仅在回调返回后处理。

要强制窗口在回调返回之前处理事件,您可以调用self.root.update_idletasks()(根据CoolCloud 的建议,除非绝对必要,否则您不应使用update())。 do_get() 应该是这样的:

def do_get(self):
    self.price_text.delete("1.0", tk.END)
    self.price_text.insert(tk.END, "PLEASE WAIT..")
    self.root.update_idletasks() # Update the window here
    result = self.lengthy_job()

【讨论】:

  • 确实如此,但如果是这样的话,他们可能会面临一个更大的问题:为什么事件没有被处理,这也是在按钮回调中跨度>
  • @CoolCloud 真;但是,由于我不知道为什么,我无法将其发布在答案中。它甚至可能是 Tcl 级别的东西,OP 可能无法自行修复,至少不使用 Python 代码。如果我知道了,我会把它放在这里。需要注意的是:update()在使用Button.bind("<Button-1>")时也需要调用。
  • 你确定吗?我从来没有遇到过这样的问题
  • @CoolCloud 感谢您的建议,我将编辑答案。
  • 哦,另外,这不是我的建议,我在 this 回答中关注 Bryan 的评论。 AFAIK,update()update_idletasks() 等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多