我有一個 tk.Text() 小部件和一個按鈕。單擊按鈕時,我想更改 Text 小部件中的文本,然后進行冗長的作業。這是按鈕命令功能的代碼片段:
price_text.delete("1.0", tk.END)
price_text.insert(tk.END, 'PLEASE WAIT..')
result = self.the_lengthy_job()
然而,'PLEASE WAIT..' 訊息直到 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() 完成后顯示。
uj5u.com熱心網友回復:
這里的問題是插入文本后視窗沒有更新。這是因為事件僅在回呼回傳后處理。
要強制視窗在回呼回傳之前處理事件,您可以呼叫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()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/407823.html
標籤:
上一篇:Tkinter框架的尺寸不同于給定的尺寸和idk為什么
下一篇:如何只允許頂部框架垂直拉伸
