Seite 1 von 1

Mehrere Fragen zu Plots in Tkinter

Verfasst: Freitag 29. Juli 2011, 01:48
von Arp
Hallo,

ich habe es nun geschafft einen Matplotlib Plot in Tkinter zu erstellen und ihn animieren zu lassen. Der Plot aktualisiert sich mit jedem neu eingelesenen Wert.

Code: Alles auswählen

class plotter(Tkinter.Tk):
	def __init__(self, parent):
		Tkinter.Tk.__init__(self, parent)
		self.protocol('WM_DELETE_WINDOW',self.close)
		self.create_canvas()		
		while True:
			self.after(3000,self.plotit())
das benutze ich für die Animation, eine sich stets wiederholende funktion. Ich weiss nicht ob das die schöne Art ist, da ich recht unerfahren bin was Tkinter bzw. guis angeht.
Jedenfalls führt das dazu das die Animtion zwar läuft, aber ich kann das Fenster mittels x nicht mehr schließen. Gibt es da irgendeinen Trick? Denn wenn ich statt self.after in der methode selber ein while 1: mit time.sleep() mache, ist es das gleiche. Das Fenster lässt sich nicht mehr mittels x schließen.

Weiterhin hab ich noch eine Frage. Ich erstelle am Anfang einen Plot fester größe. Wenn ich nun das Tk Fenster manuell während der Laufzeit größer mache, wird um den Plot herum nur unfug dargestellt. Vermutlich weil die Plotgröße sich nicht ändert. Das könnte ich dynamisch umbauen, aber wie kriege ich die jeweils aktuelle Fenster größe raus? Denn wenn ich die hätte, könnte ich die plotgröße immer anpassen.

thx.

Re: Mehrere Fragen zu Plots in Tkinter

Verfasst: Freitag 29. Juli 2011, 07:25
von Xynon1
Du kannst doch keine Endlosschleife in die Initialisierung einer Instanz von einer Klasse packen :!: Du bist mit der "after"-Methode aber schon ganz richtig, nur musst du dieser eine eigene Methode geben und am Ende dieser Methode wieder ein "after" aufrufen.

Code: Alles auswählen

    #...
    def redraw(self):
        self.plotit()
        self.after(3000, self.redraw)
    #...
So musst du nur einmal die Methode redraw() aufrufen, dannach ruft sie sich alle 3 Sekunden selbst auf.

Zweiteres kann man ohne mehr Quellcode wohl schlecht sagen, aber die Fenstergröße bekommt man über die "winfo"-Methoden "winfo_screenheight" und "winfo_screenwidth". Die Größe eines Widgets bekommt man am besten über "winfo_reqheight" und "winfo_reqwidth" herraus.

Re: Mehrere Fragen zu Plots in Tkinter

Verfasst: Freitag 29. Juli 2011, 07:56
von Arp
Hi,

Zumindest kurz kann ich schonmal Antworten, das mit dem redraw muss ich gleich erstmal ausprobieren.
Aber winfo_screenwidth/height geben aktuellen Dimensionen des gesamten Bildschirms.

Re: Mehrere Fragen zu Plots in Tkinter

Verfasst: Freitag 29. Juli 2011, 08:38
von Xynon1
Stimmt auffallend, ja das ermittelt die Größe des gesamten Bildschirmes. Wenn du die Größe des Tk-Fensters haben möchstest brauchst du die oben genannte "winfo_reqwidth/height". Eventuell brauchst du vorher auch noch ein "update_idletasks" damit die Größen aktualisiert werden.

Re: Mehrere Fragen zu Plots in Tkinter

Verfasst: Freitag 29. Juli 2011, 09:41
von BlackJack
Wobei man dazu sagen muss, dass es schwierig bis unmöglich sein kann die tatsächliche Grösse des gesamten Fensters zu ermitteln. Denn nur der Fensterinhalt ist unter Kontrolle des GUI-Toolkits. Ein eventuell vorhandener Rahmen und eine Fensterleiste fallen in die Zuständigkeit der Fensterverwaltung.