2016-12-23 3 views
0

gut mit diesem Code Ich möchte dynamische Grafik machen, möchte ich meine Grafik löschen alle 60 Sekunden, aber ich kann es nicht mit cla() und clf() arbeiten, was ist los? Gibt es einen anderen Weg, um Graphen zu löschen, außer mit cla() und clf()?wie man Graph tkinter

#import lib client paho mqtt 
from Tkinter import * 
from ttk import * 
from datetime import datetime 
import matplotlib 
import paho.mqtt.client as mqtt 
import redis, time 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
from matplotlib.figure import Figure 
from matplotlib import style 
import matplotlib.pyplot as plt 
from matplotlib.pyplot import get_current_fig_manager 

mqttc = mqtt.Client("serverclient",clean_session=False)#inisialisasi mqtt client 
r = redis.Redis("localhost",6379) 
start = time.time() 
date = datetime.now().strftime('%S') 
f = Figure(figsize=(5,4), dpi=100) 
a = f.add_subplot(111) 
b = f.add_subplot(111) 
style.use('ggplot') 
matplotlib.use("TkAgg") 
suhu=30 
cahaya=50 


def mqttx(): 
    #fungsi callback 
    def on_message(mqttc,obj,msg): 
     global LED1 
     global LED2 
     datasuhu = r.lrange("suhu",-1,-1) 
     datacahaya = r.lrange("cahaya",-1,-1) 
     print "Telah Diterima message : "+msg.payload+" topik "+msg.topic 
     r.rpush(msg.topic,msg.payload) 

    mqttc.on_message = on_message 

    mqttc.connect("localhost",1883) 

    mqttc.subscribe("suhu") 
    mqttc.subscribe("cahaya") 

class Example(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.parent = parent 
     self.initUI() 

     self.graph() 

    def initUI(self): 

     self.parent.title("Subcriber") 
     self.style = Style() 
     self.style.theme_use("default") 
     self.pack(fill=BOTH, expand=1) 

     self.xList1 = [] 
     self.yList1 = [] 
     self.canvas = FigureCanvasTkAgg(f, self) 

     self.canvas.show() 
     self.canvas.get_tk_widget().pack(expand=True) 
     thismanager = get_current_fig_manager() 
     thismanager.window.wm_geometry("+500+0") 


    def graph(self): 
     suhu1 = r.lrange("suhu",-1,-1) 
     cahaya1 = r.lrange("cahaya",-1,-1) 
     date = datetime.now().strftime('%S') 
     join1=str(''.join(suhu1)) 
     suhugraph=float(join1) 

     join2=str(''.join(cahaya1)) 
     cahayagraph=float(join2) 

     self.xList1.append(date) 
     self.yList1.append(suhugraph) 
     a.clear() 
     a.axis([0, 100, 0, 60]) 
     a.plot(self.xList1, self.yList1,"r-") 

     if date=="00" : 
      plt.clf() 
      plt.cla() 
     else: 

      self.canvas.draw() 

     self.after(1000, self.graph) 

def main(): 
    root = Tk() 
    root.geometry("1500x1400+300+300") 
    app = Example(root) 

    root.mainloop() 

if __name__ == '__main__': 

    mqttx() 
    mqttc.loop_start() 
    main() 
+0

BTW: Sie haben keine Sekunden in Zeichenfolge zu konvertieren - 'datetime.now() second' – furas

+0

' '' .join() 'String erstellt, so dass Sie benötigen' str nicht() '. - 'suhugraph = float (''. beitreten (suhu1))' – furas

+0

@furas oh ja danke Kumpel, aber können Sie mir mit meinem Problem helfen? Kann Matplotlib Abbildung/Leinwand hier nicht klar –

Antwort

0

Um klare grafische Darstellung von Daten aus self.xList1 entfernen müssen und self.yList1

self.xList1 = [] 
self.yList1 = [] 

weil nach Grundstück Clearing (a.clear()/plt.clf()/plt.cla()) Sie haben noch Daten in Listen und Sie ziehen sie wieder.

Ich kann nicht Ihren Code mit Redis laufen und mqtt so machte ich Version mit random

import matplotlib 
matplotlib.use("TkAgg") 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 

import matplotlib.pyplot as plt 
from matplotlib.figure import Figure 

import Tkinter as tk 
from datetime import datetime 

import random 

# --- classes --- (CamelCase names) 

class Example(tk.Frame): 

    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     # you don't need self.parent - tk.Frame sets self.master = parent   
     self.pack(expand=True, fill='both') # put frame inside Tk() window (and resize) 

     self.x_list_1 = [] 
     self.y_list_1 = [] 

     self.initUI() 

     self.draw() 

    def initUI(self): 
     self.fig = Figure(figsize=(5, 4), dpi=100) 
     self.a = self.fig.add_subplot(111) 
     self.a.axis((0, 100, 0, 60)) 

     self.canvas = FigureCanvasTkAgg(self.fig, self) 
     self.canvas.get_tk_widget().pack(expand=True, fill='both') 

    def draw(self): 

     date = datetime.now().strftime('%S') 
     suhugraph = random.randint(1, 60) 

     if date == "00": 
      self.a.clear() 
      self.a.axis((0, 100, 0, 60)) 
      self.x_list_1 = [] 
      self.y_list_1 = [] 

     self.x_list_1.append(date) 
     self.y_list_1.append(suhugraph) 

     self.a.plot(self.x_list_1, self.y_list_1, "r-") 
     self.canvas.draw() 

     self.after(1000, self.draw) 

# --- functions --- (lower_case names) 

def main(): 
    root = tk.Tk() 
    app = Example(root) 
    root.mainloop() 

# --- main --- 

if __name__ == '__main__': 
    main() 

BTW: matplotlib: clearing a plot, when to use cla(), clf() or close()?


Wie für die Reaktion nach dem Ändern der Größe - Problem zwei Schleifen sein kann Code: root.mainloop() und wahrscheinlich mqttc.loop_start(). Ich kann Code mit mqttc nicht laufen lassen, also kann ich es nicht prüfen.


BTW: Aktualisierung Grundstück ohne plot() und clear()

Zuerst erstellen Sie leere Zeile

self.line, = self.a.plot([], [], "r-") 

und später alle Daten in Zeile ersetzen

self.line.set_xdata(self.x_list_1) 
self.line.set_ydata(self.y_list_1) 

, so dass Sie don‘ t brauchen clear() und Achse erneut einstellen.

import matplotlib 
matplotlib.use("TkAgg") 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 

import matplotlib.pyplot as plt 
from matplotlib.figure import Figure 

import Tkinter as tk 
from datetime import datetime 

import random 

# --- classes --- (CamelCase names) 

class Example(tk.Frame): 

    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     # you don't need self.parent - tk.Frame sets self.master = parent   
     self.pack(expand=True, fill='both') # put frame inside Tk() window (and resize) 

     self.x_list_1 = [] 
     self.y_list_1 = [] 

     self.initUI() 

     self.draw() 

    def initUI(self): 
     self.fig = Figure(figsize=(5, 4), dpi=100) 
     self.a = self.fig.add_subplot(111) 
     self.a.axis((0, 100, 0, 60)) 

     self.canvas = FigureCanvasTkAgg(self.fig, self) 
     self.canvas.get_tk_widget().pack(expand=True, fill='both') 

     # create empty line 
     self.line, = self.a.plot([], [], "r-") 

    def draw(self): 

     date = datetime.now().strftime('%S') 
     suhugraph = random.randint(1, 60) 

     if date == "00": 
      self.x_list_1 = [] 
      self.y_list_1 = [] 

     self.x_list_1.append(date) 
     self.y_list_1.append(suhugraph) 

     # update data in line without `plot()` (and without `clear()`) 
     self.line.set_xdata(self.x_list_1) 
     self.line.set_ydata(self.y_list_1) 

     self.canvas.draw() 

     self.after(1000, self.draw) 

# --- functions --- (lower_case names) 

def main(): 
    root = tk.Tk() 
    app = Example(root) 
    root.mainloop() 

# --- main --- 

if __name__ == '__main__': 
    main() 
Verwandte Themen