Seite 1 von 1

Canvas Zeichnung dynamisch aktualisieren

Verfasst: Dienstag 11. August 2009, 10:59
von ollivah
Hallo,
ich bin neu hier und habe auch noch nicht so richtig viel ahnung von Python etc.

Ich habe eine Frage:
Ich möchte mit TKinter/Canvas ein Fenster erzeugen in dem 6 Balken zusehen sind, welche in der "Länge" variiren sollen. Und zwar sollen sie die Länge gleich den aus dem Seriellen Port eingelesenen Werten bekommen.

Das einlesen der Seriellen werte habe ich breits fertig. Auch das erstellen des Fensters und der Balken.
Woran es hapert, ist die dynamische Aktualisierung der Balken.

Mein Code: (auslesen des Com Ports ist z.Zt. deaktiviert.)

Code: Alles auswählen

from Tkinter import *
import sys
import serial
serial = serial.Serial("COM5", 115200)

#while True:
# input = serial.readline().strip()
class Application(Frame):
    def createWidgets(self):
        self.CAN = Canvas(self, width=370, height=500, background='white')
        self.CAN.pack()
        self.CAN.create_rectangle(10, 10, 60, 50, width = 0, tag = "Sensor 1", fill = "red")
        self.CAN.create_rectangle(70, 10, 120, 60, width = 0, tag = "Sensor 2", fill = "blue")
        self.CAN.create_rectangle(130, 10, 180, 70, width = 0, tag = "label", fill = "green")
        self.CAN.create_rectangle(190, 10, 240, 80, width = 0, tag = "label", fill = "yellow")
        self.CAN.create_rectangle(250, 10, 300, 90, width = 0, tag = "label", fill = "orange")
        self.CAN.create_rectangle(310, 10, 360, 100, width = 0, tag = "label", fill = "black")
        self.CAN.update_idletasks()
       
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

app = Application()
app.mainloop()
Habt ihr da Ideen und könnt mir helfen? Ich wäre sehr dankbar.

Grüße,

Verfasst: Dienstag 11. August 2009, 16:48
von wuf
Hallo ollivah

Hier etwas zum experimentieren und zum verbessern:

Code: Alles auswählen

import Tkinter as tk
import sys
import serial

#serial = serial.Serial("COM5", 115200)

class Application(tk.Frame):

    BAR_XORG = 10
    BAR_YORG = 10
    BAR_WIDTH = 50
    BAR_HEIGHT = 0
    BAR_XGAP = 10
    BAR_ITEMS = (("Sensor-1", "red"), ("Sensor-2", "blue"),
        ("Sensor-3","green"), ("Sensor-4","yellow"))
    BAR_MAX_VALUE = 100

    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        self.canvas = tk.Canvas(self, width=370, height=500, background='white')
        self.canvas.pack()

        max_bar_height =  500 - 2 * self.BAR_YORG
        self.bar_yfac = float(max_bar_height) / float(self.BAR_MAX_VALUE)

        xpos = self.BAR_XORG
        ypos = self.BAR_YORG
        for bar_name, bar_color in self.BAR_ITEMS:
            self.canvas.create_rectangle(xpos, ypos, xpos+self.BAR_WIDTH,
                ypos+self.BAR_HEIGHT, tag=bar_name, fill=bar_color, width=0)
            xpos += self.BAR_XGAP + self.BAR_WIDTH

    def update_bar(self, bar_name, bar_data):

        bar_height = bar_data * self.bar_yfac
        x0, y0, x1, y1 = self.canvas.coords(bar_name)
        self.canvas.coords(bar_name, (x0, y0, x1, y0+bar_height))

#--- MODUL-TEST --------------------------------------------------------------#
if __name__ == "__main__":

    def increment_bar_data():
        app.update_bar("Sensor-4", app.test_data)
        if app.test_data < 100.0:
            app.test_data += 5.0
        app.after(100, increment_bar_data)

    app_win = tk.Tk()
    app_win.title("Bar-Display")

    app = Application(app_win)

    app.test_data = 0.0
 
    app.update_bar("Sensor-1", 25.0)
    app.update_bar("Sensor-2", 50.0)
    app.update_bar("Sensor-3", 75.0)
    increment_bar_data()

    app_win.mainloop()
Gruss wuf :wink:

Verfasst: Dienstag 11. August 2009, 19:12
von ollivah
Vielen Dank, ich bin schon jetzt begeistert.
Werds morgen gleich mal ausprobieren.

Gruß, Ollivah

Verfasst: Mittwoch 12. August 2009, 13:25
von yipyip
Falls es Dir moeglich ist, Python 3.1 zu verwenden (das neue pyserial 2.5-rc1 soll wohl kompatibel dazu sein), kannst Du auch die ttk.Progressbar benutzen. Hier eine kleine Demo :

http://paste.pocoo.org/show/133870/

:wink:
yipyip