Python Tkinter,每秒更新一次
Python Tkinter, Update every second
所以我正在创建一个 Python Tkinter 应用程序,它有一个我需要每秒显示在屏幕上的测量值。当程序 运行s 时,显示值,但它没有更新(我在外部操纵值,所以我知道显示应该改变)。如何让显示每秒动态更新?我被告知我不需要为 Tkinter 应用程序创建 Update()
方法或任何东西,因为 mainloop()
会处理这些。这是我的代码:
Main.py:
from SimpleInterface import SimpleInterface
from ADC import Converter, Differential
adc = Converter(channelNums = [2])
root = SimpleInterface(adc)
root.title = ("Test Interface")
root.mainloop()
SimpleInterface.py:
import tkinter as tk
from tkinter import ttk
class SimpleInterface(tk.Tk):
def __init__(self, ADC, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self, *args, **kwargs)
container.grid(column = 0, row = 0, sticky = "nwes")
container.grid_rowconfigure(0, weight = 1)
container.grid_columnconfigure(0, weight = 1)
frame = Screen(ADC, container, self)
frame.grid(row = 0, column = 0, sticky = "nsew")
frame.tkraise()
class Screen(tk.Frame):
def __init__(self, ADC, parent, controller):
tk.Frame.__init__(self, parent)
displayText = ADC.ReadValues() #this method returns a list of values
for i in range(len(displayText)):
displayText[i] = round(displayText[i], 2)
ttk.Label(self, text = "Test Display", background = "grey").grid(column = 7, row = 8)
lblTestDisplay = ttk.Label(self, text = displayText, foreground = "lime", background = "black").grid(column = 7, row = 9, sticky = "ew")
因此,当代码最初为 运行 时,显示正确显示 displayText
,但再次没有任何变化,因为我手动操作输入的值。我需要创建一个 Update()
方法吗?如果是这样,我会在哪里调用所述方法?
是的,您需要创建一个方法来更新值,并使用after
将该方法添加到 tkinter 主循环中。我建议将其命名为其他名称,因为 update
已经是一种 tkinter 方法。
作为一个完全未经检验的猜测:
class Screen(tk.Frame):
def __init__(self, ADC, parent, controller):
tk.Frame.__init__(self, parent)
self.ADC = ADC
lbl = ttk.Label(self, text = "Test Display", background = "grey")
lbl.grid(column = 7, row = 8)
self.lblTestDisplay = ttk.Label(self, foreground = "lime", background = "black")
self.lblTestDisplay.grid(column = 7, row = 9, sticky = "ew")
self.adc_update() # start the adc loop
def adc_update(self):
displayText = self.ADC.ReadValues() #this method returns a list of values
for i in range(len(displayText)):
displayText[i] = round(displayText[i], 2)
self.lblTestDisplay.config(text = str(displayText)) # update the display
self.after(1000, self.adc_update) # ask the mainloop to call this method again in 1,000 milliseconds
请注意,我还将您的标签创建分为两行,一行用于初始化,一行用于布局。你的方式很糟糕;它导致分配给 None 的变量导致错误。
所以我正在创建一个 Python Tkinter 应用程序,它有一个我需要每秒显示在屏幕上的测量值。当程序 运行s 时,显示值,但它没有更新(我在外部操纵值,所以我知道显示应该改变)。如何让显示每秒动态更新?我被告知我不需要为 Tkinter 应用程序创建 Update()
方法或任何东西,因为 mainloop()
会处理这些。这是我的代码:
Main.py:
from SimpleInterface import SimpleInterface
from ADC import Converter, Differential
adc = Converter(channelNums = [2])
root = SimpleInterface(adc)
root.title = ("Test Interface")
root.mainloop()
SimpleInterface.py:
import tkinter as tk
from tkinter import ttk
class SimpleInterface(tk.Tk):
def __init__(self, ADC, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self, *args, **kwargs)
container.grid(column = 0, row = 0, sticky = "nwes")
container.grid_rowconfigure(0, weight = 1)
container.grid_columnconfigure(0, weight = 1)
frame = Screen(ADC, container, self)
frame.grid(row = 0, column = 0, sticky = "nsew")
frame.tkraise()
class Screen(tk.Frame):
def __init__(self, ADC, parent, controller):
tk.Frame.__init__(self, parent)
displayText = ADC.ReadValues() #this method returns a list of values
for i in range(len(displayText)):
displayText[i] = round(displayText[i], 2)
ttk.Label(self, text = "Test Display", background = "grey").grid(column = 7, row = 8)
lblTestDisplay = ttk.Label(self, text = displayText, foreground = "lime", background = "black").grid(column = 7, row = 9, sticky = "ew")
因此,当代码最初为 运行 时,显示正确显示 displayText
,但再次没有任何变化,因为我手动操作输入的值。我需要创建一个 Update()
方法吗?如果是这样,我会在哪里调用所述方法?
是的,您需要创建一个方法来更新值,并使用after
将该方法添加到 tkinter 主循环中。我建议将其命名为其他名称,因为 update
已经是一种 tkinter 方法。
作为一个完全未经检验的猜测:
class Screen(tk.Frame):
def __init__(self, ADC, parent, controller):
tk.Frame.__init__(self, parent)
self.ADC = ADC
lbl = ttk.Label(self, text = "Test Display", background = "grey")
lbl.grid(column = 7, row = 8)
self.lblTestDisplay = ttk.Label(self, foreground = "lime", background = "black")
self.lblTestDisplay.grid(column = 7, row = 9, sticky = "ew")
self.adc_update() # start the adc loop
def adc_update(self):
displayText = self.ADC.ReadValues() #this method returns a list of values
for i in range(len(displayText)):
displayText[i] = round(displayText[i], 2)
self.lblTestDisplay.config(text = str(displayText)) # update the display
self.after(1000, self.adc_update) # ask the mainloop to call this method again in 1,000 milliseconds
请注意,我还将您的标签创建分为两行,一行用于初始化,一行用于布局。你的方式很糟糕;它导致分配给 None 的变量导致错误。