GUI - Spannung als Balken anzeigen.

  • Hallo..


    Ich unternehme gerade meine ersten Gehversuche eine GUI in Python3 zu erstellen & schon stoße ich auf die ersten Hindernisse...


    Ich möchte Maschinenwerte in Echtzeit grafisch darstellen..


    Aktuell arbeite ich daran die verschiedenen Spannungen zu visualisieren.
    Dafür bietet sich die Darstellung als Balken an..
    Ungefähr so hab ich mir das vorgestellt:


    [Blocked Image: https://uploads.tapatalk-cdn.com/20170416/55696521c2ba139f0a7967d2f10d47a7.jpg]


    Als Erklärung: für jede Spannung (5V, 24V & 48V) sind jeweils 2 Netzteile vorhanden, die ich einzeln vor der Einspeisung ins System (Beschriftung: NT I & NT II) und die Gesammtsystemspannung (Beschriftung: System) visualisieren und alle 0,5s aktualisieren möchte...


    Die einzelnen Balken sollen dabei (ähnlich wie in der Skizze) eingefärbt werden...


    Da die Netzteile natürlich noch nicht angeschlossen sind gibt's natürlich keine Werte... daher soll die Variable für das jeweilige NT zunächst mit einem fixen Wert gefüllt werden...


    Die variablen sollen heißen:


    5vnt1
    5vnt2
    24vnt1
    24vnt2
    48vnt1
    48vnt2


    Wie kann ich diese Balken bauen?
    Hat jemand den entscheidenden Hinweis???


    LG Tiieto...

  • Du solltest dir erst mal das genauer anschauen: FAQ => Nützliche Links / Linksammlung => python: Tkinter: Im Hintergrund zählen
    Grund: Gestalte deine GUI am besten mithilfe von 'after' um deine Werte "in Echtzeit" zu aktualisieren.


    Bezüglich deiner 'Chart Bar' oder auch 'Bar Graph' wäre es denk ich am einfachsten wenn du dir eine Klasse erstellst, da du ja nicht nur einen sondern mehrere erstellen willst.
    Es gibt mehrere Wege sowas zu erstellen, entweder Nativ nur mit Tkinter, oder zB. mithilfe der matplotlib


    Meistens ist das Vorgehen gleich:
    Man erstellt ein Canvas, zeichnet dort mit "create_rectangle" hinein und setzt eine Farbe zum füllen des ganzen (fill). Beispiel: http://stackoverflow.com/quest…draw-a-specific-bar-chart


    //EDIT: Evtl. kann man auch das missbrauchen: http://stackoverflow.com/a/7310778/2641799



    //EDIT2: Würdest du dann dein Ergebnis mit uns teilen? ;)

  • Da ich selber auch solch ein 'bar graph' benötige hab ich den letzten Tagen versucht eine entsprechende Klasse zu schreiben, die man universell einsetzen kann bzw mehrere Balken erzeugen kann.


    Das Vorgehen ist wie bereits erwähnt:


    - Canvas mit definierter Größe erstellen.
    - Klassen Objekt an eine Variable binden und mit entsprechenden Parametern erzeugen.
    - Wahlweise direkt bei Initialisierung des Klassen Objekts, oder späterem Aufruf, den Wert setzen.
    - Balken zeichnen lassen.


    Der Wert des Balkens wird standardmäßig nicht als Titel gesetzt. Mit entsprechendem Parameter kann man aber automatisch den Zahlenwert als Titel setzen lassen.
    Um den 'Chart Bar' nachträglich zu ändern gibts eine "update" Methode, die sowohl den Balken als auch den Titel löscht und neu zeichnet. Neuen Wert muss man beim ausführen mit übergeben.


    Benötigt man mehrere 'Chart Bar's setzt man bei Initialisierung den "x" Wert höher => Standard Bereite eines Balkens ist 20. Neuen x Wert muss man +20 rechnen damit sich das nicht überlappt.


    Entwickeln tu ich sowas in der interaktiven Python Konsole... Also einfach "python3" in der Shell ausführen und dort dann folgenden Code via copy&paste... Nur darauf achten erst nur bis zur Zeile "c.pack()" einzufügen und dann eine Sekunde warten bis die anderen Zeilen folgen, dann kommt man auch ohne "mainloop" aus - zum testen.


    BarGraph:
    [code=php]
    #!/usr/bin/python3
    #
    # Creator: meigrafd
    # Copyright (C) 2017 by meiraspi@gmail.com published under the Creative Commons License (BY-NC-SA)
    #
    # http://www.forum-raspberrypi.d…nnung-als-balken-anzeigen
    #
    import tkinter as tk



    class BarGraph(object):
    def __init__(self, canvas=None, x=0, y=0, width=20, height=None, color='red', outline='black', title=False, title_align=tk.SW, tags='', value=0):
    self.canvas = canvas
    # http://infohost.nmt.edu/tcc/he…/tkinter/web/anchors.html
    self.title_align = title_align
    self.title = title
    self.tags = tags
    # http://infohost.nmt.edu/tcc/he…nter/web/coordinates.html
    self.x = x # Top left to right coordinate
    self.y = y # Top left to bottom coordinate
    self.background_color = color
    self.border_color = outline
    self.font=('', 6)
    self.width = width
    self.height = height
    self.canvas_width = canvas.winfo_width()
    self.canvas_height = canvas.winfo_height()
    if not self.height:
    self.height = self.canvas_height
    self.set_value(value)

    def set_value(self, value):
    self.value = value
    if self.title is not False and type(self.title) is not str:
    self.title = value

    def update(self, value):
    self.canvas.delete(self.bar)
    self.canvas.delete(self.bar_title)
    self.set_value(value)
    self.draw()

    def draw(self):
    # Bottom left coordinate
    if self.x == 0:
    x0 = 0
    else:
    x0 = self.x + self.width
    # Top left coordinates
    y0 = self.height - self.value

    # Bottom right coordinates
    x1 = x0 + self.width
    # Top right coordinates
    y1 = self.height

    # http://infohost.nmt.edu/tcc/he…web/create_rectangle.html
    # Draw the bar
    self.bar = self.canvas.create_rectangle(x0, y0, x1, y1, fill=self.background_color, outline=self.border_color)
    # Put the title above the bar
    if self.title:
    self.bar_title = self.canvas.create_text(x0 + 3, y0, anchor=self.title_align, font=self.font, text=str(self.title))
    [/php]


    Beispiel zur Anwendung:
    [code=php]
    root = tk.Tk()
    root.title("Bar Graph")


    c = tk.Canvas(master=root, width=500, height=200)
    c.pack()


    b1 = BarGraph(canvas=c, color='yellow', value=189)
    b1.draw()


    b2 = BarGraph(canvas=c, color='blue', x=10, title=True)
    b2.set_value(97)
    b2.draw()
    b2.update(103)


    b3 = BarGraph(canvas=c, x=30, value=189, title='bla')
    b3.draw()


    b3.title=True
    b3.update(187)


    b3.title='blub'
    b3.update(177)
    [/php]
    ...die einzelnen Abschnitte ruhig erst nach und nach copy&pasten - also nach jeder Leerzeile erst mal das Tkinter Fenster betrachten ;)


    Übersichtlicher => http://codepad.org/sgeTKo9N


    Einige Fehler sind noch enthalten, insbesondere bezüglich der Platzierung....



    Ich hoffe ihr Teilt Änderungen an dem Code oder gebt Feedback - auch wenn das hier nicht mein Thread ist ;)
    Danke.

  • Hallo meigrafd


    Ich werd das mal versuchen in meine GUI mit einzubauen...


    Mein aktueller stand ist, dass ich die BarGrafen für jeden fall neu geschrieben habe.. (Klassen übersteigt meine Python Fähigkeit um einiges... =( )


    So siehts bei mir gerade aus (vor einarbeiten deiner Klasse):



    der dazu gehörige Code:



    Ich weiß: Stümperhaft zusammengeschustert, aber immerhin mein allererstes Python Projekt.... (und dann auch direkt ne GUI :shy: )


    LG Tiieto

  • Das sieht doch schon nicht so schlecht aus, auch wenn du halt noch statische Werte verwendest :X


    ttk hab ich bisher wenig verwendet - bei dir sieht man aber das es sich lohnt ;) Probier ich nachher auch mal aus.


    Bin jedenfalls beeindruckt was du in so kurzer Zeit bereits erreicht hast :thumbs1:


    Hast du dir schon Gedanken zur Erfassung & Aktualisierung der Daten gemacht?





    PS: Leider hast du den Code aus deinem SSH Fenster heraus kopiert, wodurch die Zeilen nicht vollständig mit kopiert wurden ( $ am Ende der Zeilen ). Betrifft zZt aber nur die Kommentare.

  • Was ist denn jetzt hier passiert?? Eben waren noch ein paar Beiträge mehr hier & jetzt ist alles weg??? :s :s


    @ meigrafd: Zur Aktualisierung der Daten hab ich mir bis jetzt noch keine Gedanken gemacht...


    Ich wollte zunächst erstmal die Oberfläche fertig bauen und dann die Variablen an entsprechender stelle einfügen...
    quasi eins nach dem anderen...


    Zumal ich noch geeignete Sensoren zur Erfassung der Ströme & Spannungen suche ohne das die Auflösung zu stark darunter leidet...


    Bis jetzt habe ich "nur" die Temperatursensoren hier rumliegen (DS18B20) die ich dann zu gegebener Zeit anschließe & auswerte... (muss damit auch erstmal etwas "spielen"...)


    LG Tiieto

    Edited once, last by Tiieto ().

  • Ich hätte auch nichts dagegen gemeinsam weiter an dieser Sache zu schrauben...


    Hilft mir ja auch etwas weiter den ganzen python kram hier zu verstehen... :Egoismus: ;)



    ==== EDIT ====
    Hab dann jetzt mal Dein Script in eine Datei gepackt, die shebang angepasst


    Code
    #!/usr/bin/env python3


    und das ganze dann ausführbar gemacht (chmod 777 *.py)


    nach dem ausführen erhalte ich ein weißes Fenster ohne irgendwelche BarGrafen... (Ich mach das übrigens auf nem MacBook, der Raspi der das bekommen soll schlummert noch... ;) )


    Hier mal der Inhalt der Datei.. - evtl hab ich da was falsch gemacht beim C&P ?



    Ich zu doof?


    LG Tiieto

    Edited once, last by Tiieto ().