2016-07-13 15 views
0

Ich erstelle eine GUI, um Live-Graphen von Temperatursensoren mit tkinter und Animationsfunktion von Matplotlib zu plotten. Ich bekomme schöne Live-Grafiken. Aber das Problem, mit dem ich konfrontiert bin, ist, dass die Live-Grafiken beginnen, sobald ich die Anwendung starte. Ich habe eine Schaltfläche zum Aufruf eines Befehls in Klasse StartPage erstellt, aber es funktioniert nicht. Ich möchte, dass meine Anwendung mit dem Sammeln von Daten und dem Zeichnen von Diagrammen beginnt, wenn ich auf klicke. Start Überwachung in der Klasse StartPagePython GUI und Animation

Es wäre ein großer Gefallen, wenn mir jemand dabei helfen könnte.

Thann Sie.

def animate(i): 

ipcon = IPConnection() # Create IP connection 
ptc1 = BrickletPTC(UID1, ipcon) # S3 
ptc2 = BrickletPTC(UID2, ipcon) # S7 
ptc3 = BrickletPTC(UID3, ipcon) # S7 
ptc4 = BrickletPTC(UID4, ipcon) # S7 

ipcon.connect(HOST, PORT) # Connect to brickd 
temperature1 = ptc1.get_temperature() - 20 
temperature2 = ptc2.get_temperature() + 6 
temperature3 = ptc3.get_temperature() + 3 
temperature4 = ptc4.get_temperature() + 29 

l = [temperature1, temperature2] 
avgTemp = np.mean(l) 
avgTempM = str(avgTemp/100) 

dataArrayavg = avgTempM.split(',') 
tempavg = float(dataArrayavg[0]) 
tempCavg.append(tempavg) 
avg.set_xlabel('Time [s]', fontsize = 10) 
avg.set_ylabel('Temperature [°C]', fontsize = 10) 
y_formatter = matplotlib.ticker.ScalarFormatter(useOffset=False) 
avg.yaxis.set_major_formatter(y_formatter) 
titleavg = "Average Room Temperature: " + str(temperature1/100) + " °C" 
avg.set_title(titleavg, fontsize = 12) 
avg.plot(tempCavg, "#483D8B") 


f1.savefig('RoomTemperature.png') 
f2.savefig('ObjectTemperature.png') 


class StartPage(tk.Frame): 


def __init__(self, parent, controller): 
    tk.Frame.__init__(self, parent) 

    # Adding a logo to the startpage 
    logo = Image.open("Gemeinschaftslogo(5).jpg") 
    Image1 = ImageTk.PhotoImage(logo) 

    # defining the image label 
    imageLabel = Label(self, image = Image1) 
    imageLabel.image = Image1 
    imageLabel.pack(pady=30, padx=30) 

    #defining labels 
    label = ttk.Label(self, text="Zustandsüberwachung (Condition Monitoring) von industriellen Computertomographie-Systemen", font = LARGE_FONT,) 
    label.pack(pady=10, padx=10) 

    #creating button 
    #if agree then move to temperature graph 
    button1 = ttk.Button(self, text="Start Monitoring", 
         command=lambda: animate()) # with lambda we are moving from start page to page 1 

    button1.pack(pady=30, padx=30) 

    button2 = ttk.Button(self, text="Enter", 
         command=lambda: controller.show_frame(RoomTempGraph)) # with lambda we are moving from start page to page 1 

ani1 = animation.FuncAnimation(f1,animate, interval = 1000) 
app.mainloop() 
+0

Ihre Einrückung scheint gebrochen. Es ist nicht klar, wie viel Code in 'def animate (i) gehört:' –

+0

@BryanOakley danke für die Antwort könnte ein Fehler beim Kopieren des Textes gewesen sein. Der Eindruck innerhalb von animiert (i) ist gut. – Ajay

+0

Ich nehme an, das ist die Zeile, die die Animation auslöst: 'ani1 = animation.FuncAnimation (f1, animate, interval = 1000)'. Das sollte in den Button-Befehlen verschoben werden. Und im Befehl button1 scheint Ihr 'lambda: animate()' den 'i' Parameter zu verpassen. –

Antwort

0

Ok, schmutzig Hack:

global do_animate 
do_animate = False 

Ihren Befehl Änderung wie folgt:

#creating button 
#if agree then move to temperature graph 
button1 = ttk.Button(self, text="Start Monitoring", 
        command=lambda: do_animate=True) # with lambda we are moving from start page to page 1 

und in animate nur if do_animate == False zurückkehren

+0

Danke für Ihre Bemühungen Jean Ich habe es versucht, aber es zeigt nicht die Graphen, wenn der Befehl 'ani1 = animation.FuncAnimation (f1, animate, interval = 1000)' von dort bewegt wird. – Ajay

+0

hat die Lösung geändert –

+0

Leider keine Ausgabe. Danke für deine Mühe und Hilfe Jean scheint, dass diese Animationsfunktion Schmerz ist, ich sollte versuchen, etwas Einfaches zu tun. : D – Ajay

0

Ähnlich wie Jean-François Fabre-Lösung, Das wird dein animate() nicht davon abhalten zu laufen, aber es wird mich aufhalten t nichts zu tun.

def animate(i): 
    global draw 
    if draw: 
     """ here goes all you want your animate func to do """ 
    draw = False 

So durch Hinzufügen, was Sie wollen innerhalb des if Unentschieden tun, werden Sie sicherstellen, dass es nur einmal gezogen werden und dann wieder nicht. Soll es weiterhin gezeichnet werden, entferne draw = False am Ende. Je nachdem, was Sie wollen, müssen Sie in init zeichnen.

class startpage(tk.Frame): 
    def __init__(self, parent, controller): 
     global draw 
     draw = False #if you want it to start without drawing 

Dies ist zumindest wie ich diese Art von Sache in meinem Programm arbeiten. Du brauchst offensichtlich einen Weg, um Draw irgendwo auf True zu setzen, und das könnte was auch immer sein. In meinem Programm habe ich es so eingestellt, dass es gezeichnet wird, wenn ich etwas ändere, was gezeichnet werden soll, aber du möchtest vielleicht einen Knopf, weil du willst, dass es weitergeht.

+0

Hallo @ Paolo Vielen Dank für Ihre Antwort .. Ich benutze, was Sie sagten, aber es ist ein Fehler in Animate Sprichwort ist nicht definiert .. Es tut mir leid, ich bin ein Neby, ich habe nicht unterstrichen, was 'Unentschieden = Falsch 'in' def def __init __ (Selbst, Eltern, Controller): 'tut. Ich denke, dass es Fehler wirft, weil Zeichen dort nicht definiert wird. – Ajay

+0

sry für langsame Antwort! So wird der __init__ das erste Mal ausgeführt, wenn Sie das Programm starten. Also werden alle darin deklarierten Globals "gespeichert". Das Problem war, ich hätte nicht gesagt, dass es dort global sein sollte. Ich habe es bearbeitet, um es zu reparieren. Der Zweck ist, das Programm wissen zu lassen, dass es eine Variable gibt, die trotzdem erreichbar sein sollte und dass der Wert der Variablen Falsch ist. Was das bedeutet ist, wenn Ihr Programm in die Animation geht, wird es prüfen: Ist das Zeichen wahr? Und es wird wissen, dass Zeichnen falsch ist, und nichts in der if-Anweisung tun. Dann brauchen Sie eine Schaltfläche, um die Zeichnung auf "True" zu setzen, damit sie beim Klicken gezeichnet wird. –

0

Habe gerade einen Weg gefunden, mein eigenes Problem zu lösen. Ich hoffe, dass es helfen, jemand

vor app.mainloop könnte() i erstellt eine Testfunktion

app.geometry("1280x720") 


def test(): 

    ani1 = animation.FuncAnimation(f1,animate1, interval = 1000) 
    ani2 = animation.FuncAnimation(f2,animate2, interval = 1000) 
    ani1._start(test) 
    ani2._start(test) 

app.mainloop() 

, die ich

auf der Seite meiner Befehlsschaltfläche übergeben
button1 = ttk.Button(self, text="Start Monitoring", 
         command=lambda: test()) # with lambda we are moving from start page to page 1 

Ich habe keine Ahnung, wie es funktioniert, aber es beginnt zu plotten, wenn ich es frage ..: D

danke nochmal jeder. Einen schönen Tag haben