2017-06-23 3 views
0

Also erstelle ich eine Python Tkinter-Anwendung, die einen gemessenen Wert hat, den ich jede Sekunde auf dem Bildschirm anzeigen muss. Wenn das Programm läuft, wird der Wert angezeigt, aber es wird nicht aktualisiert (ich manipuliere den Wert extern, daher weiß ich, dass sich die Anzeige ändern sollte). Wie kann ich die Anzeige dynamisch jede Sekunde aktualisieren? Ich wurde gemacht zu verstehen, dass ich keine Update() Methode oder irgendetwas für Tkinter Anwendungen erstellen musste, weil mainloop() dafür sorgt. Hier ist mein Code:Python Tkinter, Update jede Sekunde

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") 

So das Display richtig zeigt die displayText, wenn der Code zunächst ausgeführt wird, aber auch hier ändert sich nichts als Ich manipuliere manuell den eingegebenen Wert. Muss ich eine Update() Methode erstellen? Wenn ja, wo würde ich diese Methode nennen?

Antwort

3

Ja, Sie müssen eine Methode zum Aktualisieren der Werte erstellen und diese Methode mit after zur tkinter-Hauptschleife hinzufügen. Ich würde empfehlen, es etwas anderes zu nennen, weil update bereits eine tkinter Methode ist.

Als völlig ungetestet Vermutung:

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 

Hinweis ich teilten auch Ihre Erstellung von Etiketten in zwei Linien, eine initialisieren und ein bis Layout. Die Art, wie du es hast, ist sehr schlecht. es führt zu der Variablen, die keiner zugeordnet ist, was zu Fehlern führt.

+0

Vielen Dank. Und mir war nicht bewusst, dass die Art und Weise, wie ich das Initialisieren und Layout hatte, eine Keine-Variable verursachte. Daran muss ich mich für die Zukunft erinnern. Prost! – Skitzafreak