2 回答

TA貢獻2021條經驗 獲得超8個贊
下面是一個示例腳本,向您展示如何以特定時間間隔更新標簽小部件中的值。我為您提供了超鏈接以幫助您理解 tkinter 的方法。此致。
關鍵點:
使用tk.Label 小部件
textvariable
的選項。使用tkinter 的控制變量。我已經向您展示了如何設置和獲取它的值。
您可以使用調用的 tkinter 小部件方法,
.after()
而無需顯式使用 while 語句和time.sleep()
方法。Tkinter 有自己的事件循環供您使用。將你的 tkinter GUI 編寫為一個類可以更容易地實現你需要的東西。
示例腳本:
import tkinter as tk
class App(tk.Frame):
def __init__( self, master, *args, **kw ):
super().__init__( master )
self.master = master
self.create_label()
self.update_label()
def create_label( self ):
self.var = tk.IntVar() # Holds an int; default value 0
self.label = tk.Label(self, textvariable=self.var ) # Use textvariable not text
self.label.pack()
def update_label( self ):
value = self.get_value()
self.var.set( value ) # Set the label widget textvariable value.
self.after(1000, self.update_label) # Call this method after 1000 ms.
def get_value( self ):
'''To simulate calling a function to return a value'''
value = self.var.get() + 1
return value
if __name__ == "__main__":
root = tk.Tk()
root.geometry('100x100+0+24')
app = App( root )
app.pack()
root.mainloop() #This command activates tkinter's event loop
編輯:
作為澄清,這個答案展示了如何利用
.after()
和.mainloop()
中的方法GUI Testing.py
,即使用 tkinter 事件循環而不是使用兩個 while 循環,來實現你想做的事情。這是一種簡化 GUI 腳本的方法。對于更復雜的算法,例如涉及多個 while 循環,您必須研究使用線程(注意它有它的問題)或者最近我找到了一種使用 python 的 Asyncio 方法來完成它的方法。這兩種方法的學習曲線要陡峭得多。要使用 asyncio 方法,您可以探索修改我的答案以執行您想要的操作。

TA貢獻1802條經驗 獲得超4個贊
最好的解決方案是使用線程,但是如果您打算以最簡單的方式進行,那么在您的 Tkinter GUI 中實現主循環,一旦您讀取數據包,只需在同一循環中在您的 GUI 上更新它。這是更新后的工作代碼。
import tkinter as tk
import time
def setvalue(self, x):
self.label.config(text=x, )
root.update()
time.sleep(1)
def changevalues(self):
x = 99
self.label = tk.Label(root, text=x)
self.label.pack()
while x >0:
x -= 1
setvalue(root,x)
root = tk.Tk()
changevalues(root)
root.mainloop()
添加回答
舉報