errechnete Werte in Canvas anzeigen

Fragen zu Tkinter.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

@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.
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Doch, das gibt es - direkt zwischen diesem Eingabefenster und der Toolbar mit B, I, Quote, Code etc...

Der code-button funktioniert auch, aber du musst schon die tags in ordnung lassen.
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

@pyzip: Sei beruhigt, ist mir in den ersten Wochen nicht anders ergangen, gesucht und gesucht und dennoch über das Feld hinweggesehen.

Bild
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

danke...na denn...
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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

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()
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

@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
Antworten