Mehrere Fragen zu Plots in Tkinter

Fragen zu Tkinter.
Antworten
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

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.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

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.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
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.
Antworten