Gnuplotausgabe in root?

Fragen zu Tkinter.
Antworten
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Tag zusammen,

ich habe die Frage zwar schon in einem anderen Thread gestellt, aber dort wurde eine anderes "Problem" so umfangreich, dass es gar nicht mehr dran kam und ich hierfür jetzt lieber etwas neues aufmache.

Bisher habe ich eine Reihe von Messungen (Strom und Spannung) die ich mit Gnuplot ausgebe

Code: Alles auswählen

			self.g = Gnuplot.Gnuplot()
			self.g.title('I(V)-Kennlinie')
			self.g.xlabel('Voltage (V)')
			self.g.ylabel('Current (A)')
			self.g('set style data linespoints')
			self.data = list()
Wenn eine neue Messung dazu kommt, füge ich sie in die Liste von "data" hinzu und gebe es aus

Code: Alles auswählen

						self.data.append([float(self.volt2),float(self.current2)])
						self.g.plot(self.data)
Das klappt so weit ganz gut, allerdings geht für die Kurve immer ein neues Fenster auf. Gibt es eine Möglichkeit, die Kurve in meinem Hauptfenster anzuzeigen? Gibt es für graphische Ausgaben vielleicht ein eigenes Feld? (In einem ScrolledText-Feld wird man so etwas wohl nicht anzeigen lassen können...)

Schonmal vielen Dank!
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Gibt es mit rein mit Tkinter keine Möglichkeit Funktionen zu zeichnen?
Schade eigentlich... :(
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Zizibee hat geschrieben:Gibt es mit rein mit Tkinter keine Möglichkeit Funktionen zu zeichnen?
Doch, gibt es: :D

Code: Alles auswählen

import Tkinter as tk

def plot(canvas, xvalues, yvalues):
    """plot graph and axes"""
    
    #some transformation values, so that graph fits into canvas:
    height = canvas.winfo_reqheight()
    width = canvas.winfo_reqwidth()

    scale_x = float(width) / (max(xvalues) - min(xvalues)) 
    scale_y = float(height) /(max(yvalues) - min(yvalues))

    move_x = - min(xvalues) * scale_x
    move_y = min(yvalues) * scale_y

    #plot axes:
    canvas.create_line(0, height + move_y, width, height + move_y)
    canvas.create_line(move_x, 0, move_x, height)

    #plot graph:
    for i in range(len(xvalues) - 1):
        punkt1 = (scale_x * xvalues[i] + move_x,
                  height - scale_y * yvalues[i] + move_y)
        punkt2 = (scale_x * xvalues[i+1] + move_x,
                  height - scale_y * yvalues[i+1] + move_y)

        canvas.create_line(punkt1[0], punkt1[1], punkt2[0], punkt2[1])



master = tk.Tk()

canvas = tk.Canvas(master, width=600, height=400)
canvas.pack()
plot(canvas, range(-10, 5), [(x**3) for x in range(-10, 5)])

tk.mainloop()
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Danke erstmal! Was man nicht so alles machen kann.
Allerdings bin ich mir gerade gar nicht mehr so sicher ob sich der ganze Aufwand des umschreibens auch wirklich lohnt. Ich bräuchte halt auch Achsenbeschriftungen, Messgrößen sollen auslesbar sein, die Kurve muss aus Messgrößen erstellt werden, es sollten auch mehrere Kurven in verschiedenen Farben gleichzeitig angezeigt werden usw.
Da hab ich gerade so meine Zweifel, ob das damit so gut machbar wäre. Aber es wäre in meinem Fenster, so wie ich das ja wollte. :)
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi,
wenn ich dich richtig verstanden habe, ist das eine recht gute Übung um zu sehen, was Tkinter.Canvas alles kann. Du kannst das eigentlich alles machen. Fang einfach an, mit dem, was du kannst. Schreib es so, das es möglichst einfach ist, es nachher immer einfach erweitern zu können. Ein paar Tips für ein etwas ausführlicheres Script:

Schreibe eine Faktor-Funktion, die du auf alle Canvaswerte anwendest, und die die gegebene Zahl so umrechnet, dass man die Werte je nach Größe gut unterscheiden kann. (ZB x=x*10) So kannst du bei verschiedenen Werten einen anderen Zoomfaktor einsetzen und bleibst flexibel.

Zur Erleichterung des Ablesens kanns du ne kleine Funktion mit ner Schleife schreiben, mit der du ein Koordinatensystem zeichnen kanns. Wenn du die ids speicherst, kannst du das KS beliebig ein- und ausschalten.

Die Linien kannst du durch die Option ´smooth=1´ als parabolischen Spline zeichnen. Die Farbe mit ´fill´ zu ändern dürfte kein Problem sein.

Und: Wenn du einmal sowas gemacht hast, hast du 1. recht viel übers Canvas und seine Möglichkeiten gelernt, und 2. ein Script, was du jederzeit als Grundlage für eine Abwandlung nehmen kannst.

mfg, jj
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Das ist eigentlich eine gute Idee, nur leider programmier ich zur Zeit nicht aus Spass an der Freude, sondern weil es Teil meines Praktikums ist. Deshalb steh ich etwas unter Zeitdruck und ich sollte in den nächsten Tagen schon eine funktionierende Version vorzeigen können :roll:
Darum muss jetzt erstmal alles hinten anstehen, was nicht so unbedingt notwendig ist...
Wenn ich aber wieder etwas mehr Luft habe (sei es hier im Praktikum oder privat), dann nehm ich mir das mal vor!
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Ok, wenn du meinst...
Ich weiß ja nicht, wie viel Zeit du in den nächsten Tagen hast, aber ich denke mit Tkinter eine akzeptable Grundversion zu basteln dürfte eigentlich nicht alzulange dauern, wenn man erstmal alles, was nicht direkt gebraucht wird, weglässt. Ich hab auch schonmal sowas in der Richtung gemacht, und das Grundscript ist echt leicht und auch recht kurz. Halt nur das Koordinatensystem mit Gitter, Achsen und Bezeichnung, was mit Schleifen echt kurz ist, die Funktionen zum Zeichnen und Verwalten der Kurven und das übliche Grundgerüst. Ich denke, das schaffst du schon, denn die speziellen Sachen, die das Programm dann perfektionieren, sind zweitrangig, das, was du erstmal brauchst, kannst du bestimmt schon (wenn nicht, findest du es schnell) ...So viel ist das nicht. Und die (nicht so tolle) Alternative hast du doch schon, oder?
Gruß, jj
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Ich beschäftige mich mit Python erst seit ca. 3 Wochen und mit den Canvas hab ich noch gar nichts gemacht. Zwar hab ich schon mit anderen Sprachen programmiert, aber ich glaube dennoch, dass das eine ganze Weile dauern dürfte, bis ich das so hin bekomme!

Am Ende meinenes Praktikums sollte ich dann auch einige Strukturen gemessen und die Messungen ausgewertet haben, wobei ich die Messstrukturen mitsammt dem ganzen Aufbau auch noch machen werden musss. Dazu kommt noch, dass ich dummerweise angekündigt habe, dass das Gründgerüst des Programmes bis Ende der Woche (also bis heute) steht. :roll:
Wenn ich dann aber endlich mal so weit bin, dass ich etwas sinvolles zum Messen da habe, (bisher messe ich nur an ein paar Widerständen rum) kann ich das Programm noch weiter den Erfordernissen anpassen und sollte auch noch etwas Zeit für solche Sachen haben.

Jetzt muss ich aber erstmal hinbekommen eine beliebig große Anzahl Messreihen aufzunehmen, alle gleichzeitig mit Gnuplot auszugeben und damit man noch was erkennen kann die einzelnen Graphen zu beschriften. :wink:
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Bin aufm Sprung, deswegen nur ein Link:
http://heim.ifi.uio.no/~hpl/Pmw.Blt/doc/
Antworten