errechnete Werte in Canvas anzeigen
@pyzip man sieht klar, dass du dem oeffnenden code-tag seine schliessende Klammer geklaut hast. Insofern ist das jetzt nicht weiter ein Mysterium. Spiel doch mal mit der Vorschau-Funktion, ich bin mir sicher das klappt.
Hallo. auch wenn ich mich jetzt völlig entblöde...es gibt kein DropDown "Code auswählen", es gibt nur "code" und dahin paste ich meinen code von Spyder.
Und zum Code an sich.
Die Klasse kennt "q"immer noch nicht!? Habe einfach keine Idee, was ich da machen soll.
Gruß Rainer
Und zum Code an sich.
Die Klasse kennt "q"immer noch nicht!? Habe einfach keine Idee, was ich da machen soll.
Gruß Rainer
Hi --deets--, also ich will mich ja jetzt nicht noch blöder darstellen, aber mit deiner Anweisung kann ich überhaupt nichts anfangen! Was verstehe ich nicht???? "Der code-button funktioniert auch, aber du musst schon die tags in ordnung lassen". Wie, wenn ich aus Spyder kopiere. Ich lass' da doch alles in Ordnung?
Rainer
Rainer
Hallo, hier also die lauffähige Version. Die Achsbeschriftungen sind aber noch nicht wirklich gut. Es funktioniert eigentlich nur mit y-Werten zwischen 0 und 1, aber dass kann ja jeder selbst einbauen...
Danke an Alle.
Gruß Rainer
Danke an Alle.
Gruß Rainer
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 28 14:31:27 2017
@author: zip
"""
import tkinter as tk
import time
from threading import Thread
import queue
DIAG_X_OFFSET_L = 100
DIAG_X_OFFSET_R = 50
DIAG_Y_OFFSET_O = 20
DIAG_Y_OFFSET_U = 150
M_LEFT = 100
M_TOP = 200
M_WIDTH = 810
M_HEIGHT = 610
C_WIDTH = M_WIDTH - 10
C_HEIGHT = M_HEIGHT - 10
DIAG_WIDTH = M_WIDTH - DIAG_X_OFFSET_L - DIAG_X_OFFSET_R
DIAG_HEIGHT = M_HEIGHT - DIAG_Y_OFFSET_O - DIAG_Y_OFFSET_U
def get_y_axis_ticks(null_p, max_p):
#Y- Beschriftung berechnen von 0_p bis max_p
#gibt String-Liste zurück!
return ['{0:.2f}'.format(i/10)
for i in range(null_p, (max_p * 10) + 1)
]
class Diagramm(tk.Frame):
def __init__(self, queue, master):
super().__init__(master)
self.queue = queue
self.master = master
self.master.title("Diagramm")
self.canvas = tk.Canvas(self, width=C_WIDTH, height=C_HEIGHT)
self.canvas.pack()
ticks = get_y_axis_ticks(0, 1)
print("das sind ticks : ", ticks)
self.zeichne_diagramm(DIAG_X_OFFSET_L, DIAG_Y_OFFSET_O,
C_WIDTH - DIAG_X_OFFSET_R,
C_HEIGHT - DIAG_Y_OFFSET_U, ticks)
self.process_coordinates()
def zeichne_diagramm(self, x_1, y_1, x_2, y_2, ticks):
x = int((y_2 - y_1)/10)
self.canvas.create_rectangle(x_1, y_1, x_2, y_2, fill="white",width=3)
for tick, i in zip(ticks, range(y_2, y_1 - x, -x)):
self.canvas.create_line(x_1, i, x_2, i, fill="black", width=1)
self.canvas.create_text(x_1 - 20, i, text=tick)
def zeichne_kreis(self, x, y, farbe="red"):
#kleiner Kreis an Pos. x, y
return self.canvas.create_oval(x - 2, y - 2, x + 2, y + 2, fill=farbe)
def zeichne_punkt(self, g):
self.zeichne_kreis((150 + (g * 10)), (150 + (g * 10)), farbe="red")
def process_coordinates(self):
while not self.queue.empty():
self.zeichne_punkt(self.queue.get())
self.canvas.after(100, self.process_coordinates)
#def counter1(q):
def counter1(q):
for i in range(1, 6):
q.put(i)
# print("aus counter i = ", i)
time.sleep(5)
def main():
q = queue.Queue()
tc = Thread(target=counter1, args=(q,))
tc.start()
root = tk.Tk()
dia = Diagramm(q, master=root)
dia.pack()
root.geometry('%dx%d+%d+%d' % (M_WIDTH, M_HEIGHT, M_LEFT, M_TOP))
root.mainloop()
if __name__ == '__main__':
main()
@pyzip: Du hast jetzt noch das Problem, dass Du an vielen Stellen Informationen über Dein Diagramm verteilt hast. Die Skalierung in Zeile 26ff, 42, 44, 50ff, und 61. Es ist also nur mit großen Aufwand möglich, daran etwas zu ändern. Ein erster Schritt wäre es, Funktionen zu schreiben, die Canvas-Koordinaten in Diagramm-Koordinaten und umgekehrt umrechnen können.
@Sirius3, ja du hast recht. Ursprünglich wollte ich auch nur ein paar Werte der Zwischenergebnisse meiner Rechnungen darstellen. Nun ist es natürlich schlau, Skalierung und Beschriftung etwas besser und universeller zu gestalten. Mal sehen...
Gruß Rainer
Gruß Rainer