Canvas Zeichnung dynamisch aktualisieren

Fragen zu Tkinter.
Antworten
ollivah
User
Beiträge: 2
Registriert: Dienstag 11. August 2009, 10:52

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,
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
ollivah
User
Beiträge: 2
Registriert: Dienstag 11. August 2009, 10:52

Vielen Dank, ich bin schon jetzt begeistert.
Werds morgen gleich mal ausprobieren.

Gruß, Ollivah
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Antworten