Python Tkinter,每秒更新一次

时间:2017-06-23 15:29:01

标签: python loops tkinter updates

所以我正在创建一个Python Tkinter应用程序,它具有我需要每秒显示在屏幕上的测量值。当程序运行时,值显示,但它没有更新(我在外部操作值,所以我知道显示应该更改)。如何让显示器每秒动态更新?我了解到我不需要为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()方法?如果是这样,我会在哪里调用所述方法?

1 个答案:

答案 0 :(得分:3)

是的,您需要创建一个更新值的方法,并将该方法添加到带有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

注意我还将标签创建分为2行,一行初始化,一行布局。你拥有它的方式非常糟糕;它导致分配给None的变量导致错误。

相关问题