Ich will Werte aus einer Programmschleife nacheinander in einem Diagramm anzeigen. Das funktioniert mit plot() nicht, weil das Plotfenster vom User geschlossen werden muß. Nachdem ich QT für einen Anfänger für zu umfangreich empfinde, wollte ich das mal in Tkinter versuchen. Leider bekomme ich entweder das komplette Diagramm am Ende der Schleife, was ja fast dem Verhalten von plot() entspricht oder es wird ein leeres Diagramm ausgegeben. Versuche mit "after" haben auch kein Ergebnis gebracht. Kann mir jemand sagen, was ich falsch mache oder geht das mit einem Tkinter-Canvas wie in plot() auch nicht?
Vielen Dank und Gruß, Rainer
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 17 17:04:15 2017
@author: Rainer
"""
from __future__ import absolute_import, division, print_function
import tkinter as tk
from math import cos, pi as PI, sin
import time
CANVAS_WIDTH = 1000
CANVAS_HEIGHT = 800
#DIAG=Diagramm
DIAG_X_OFFSET_L = 50
DIAG_X_OFFSET_R = 50
DIAG_Y_OFFSET_O = 20
DIAG_Y_OFFSET_U = 100
DIAG_WIDTH = CANVAS_WIDTH - DIAG_X_OFFSET_L - DIAG_X_OFFSET_R
DIAG_HEIGHT = CANVAS_HEIGHT - DIAG_Y_OFFSET_O - DIAG_Y_OFFSET_U
#grid festlegen, anz_x=Anz. der vertikalen, anz_y=Anz. der vertikalen
#def make_grid(anz_x, anz_y):
# x = int((DIAG_WIDTH)/anz_x)
# y = int((DIAG_HEIGHT)/anz_y)
# return x, y
def y_achse_txt(canvas, null_p, max_p):
#Y- Beschriftung berechnen von 0_p bis max_p
#gibt String-Liste zurück!
y_txt=[]
for i in range(null_p, (max_p * 10) + 1):
i=i/10
a='{0:.2f}'.format(i)
y_txt.append(a)
return y_txt
def zeichne_kreis(canvas, x, y, farbe="red"):
#kleiner Kreis an Pos. x, y
return canvas.create_oval(x - 2, y - 2, x + 2, y + 2, fill=farbe)
def zeichne_diagramm(canvas, x_1, y_1, x_2, y_2, y_txt):
x = int((y_2 - y_1)/10)
index=0
canvas.create_rectangle(x_1, y_1, x_2, y_2, fill="white",width=3)
for i in range(y_2, y_1 - x, -x):
canvas.create_line(x_1, i, x_2, i, fill="black", width=1)
canvas.create_text(x_1 - 20, i, text=y_txt[index])
index += 1
def main():
root = tk.Tk()
root.title( "Diagramm" )
canvas = tk.Canvas(root, width=CANVAS_WIDTH, height=CANVAS_HEIGHT)
canvas.pack()
a = y_achse_txt(canvas, 0, 1)
zeichne_diagramm(canvas, DIAG_X_OFFSET_L, DIAG_Y_OFFSET_O,
CANVAS_WIDTH - DIAG_X_OFFSET_R,
CANVAS_HEIGHT - DIAG_Y_OFFSET_U, a)
for i in range(5):
zeichne_kreis(canvas, 100 + (i * 10), 100 + (i * 10))
time.sleep(1)
root.mainloop()
if __name__ == '__main__':
main()