2017-06-23 216 views
0

所以我创建了一个Python Tkinter应用程序,它具有我需要每秒显示到屏幕上的测量值。当程序运行时,值显示,但它不更新(我在外部操纵该值,所以我知道显示器应该改变)。如何让显示屏每秒动态更新?我了解到,我不需要为Tkinter应用程序创建Update()方法或其他任何方法,因为mainloop()负责处理此问题。这里是我的代码:Python Tkinter,每秒更新

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()方法吗?如果是的话,我会在哪里调用上述方法?

回答

3

是的,您将需要创建一个方法来更新值,并将该方法添加到tkinter主循环after。我建议将其命名为其他东西,因为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的变量导致错误。

+0

谢谢。我不知道我的初始化和布局方式导致None变量。我将不得不记住未来。干杯! – Skitzafreak