Geschwindigkeitsabnahme beim Zeichnen von Canvas Objekten

Fragen zu Tkinter.
Antworten
Benutzeravatar
Tristan2
User
Beiträge: 3
Registriert: Samstag 15. März 2008, 18:07

Samstag 15. März 2008, 18:54

Hallo Python Programmierer,

ich fange gerade an mich in Python einzuarbeiten, stehe aber mit oop total auf dem Kriegsfuß. Früher habe ich im GFA-Basic (der ATARI-ST lebe hoch :) ) alles in Prozeduren geschrieben und mich nicht um "Erben" kümmern müssen.

Mein Problem ist:
Ich möchte einen beliebigen Text an eine beliebige Stelle schreiben und nach einer beliebigen Zeit das Ganze wiederholen.

Bislang habe ich mir unteren Code "zusammenkopiert". Bei dem allerdings die Geschwindigkeit nach einigen Sekunden völlig in den Keller geht und der Speicherverbrauch unentwegt steigt.

Könnt ihr mir helfen, danke.


Code: Alles auswählen

import random
from Tkinter import *

root = Tk()
a = Canvas(root, width = 400, height = 400)
a.pack()

def f():
    x = random.randint(100, 300) 
    y = random.randint(100, 300)
    r = random.randint(0, 255)
    farbe1 = '#%02x%02x%02x' % (r, r, r)
    text1 = str(r)
    a.create_rectangle(0, 0, 399, 399, fill = "black")
    a.create_text(x, y, fill = farbe1, text = text1, font = "Arial 80 bold")
    root.after(10, f)
        

root.after(10,f)
root.mainloop()
BlackJack

Samstag 15. März 2008, 19:13

`Canvas` ist Vektorgraphik und keine Pixelgrafik, dass heisst Du bei jedem Aufruf ein neues Rechteck und einen neuen Text und alles wird immer wieder komplett neu gezeichnet.

Es wäre vielleicht günstiger den Hintergrund des `Canvas` auf schwarz zu setzen und nur ein Textobjekt zu erzeugen und dass dann bei jedem Aufruf zu verändern.

Grundsätzlich solltest Du Dich aber vor der GUI-Programmierung ordentlich mit OOP auseinander setzen.

Edit:

Code: Alles auswählen

import random
import Tkinter as tk

def main():
    root = tk.Tk()
    canvas = tk.Canvas(root, width=400, height=400, bg='black')
    canvas.pack()
    text = canvas.create_text(0, 0, text='', font='Arial 80 bold')
    
    def update():
        v = random.randint(0, 255)
        canvas.itemconfig(text, text=str(v), fill='#%02x%02x%02x' % (v, v, v))
        canvas.coords(text, random.randint(100, 300), random.randint(100, 300))
        canvas.after(10, update)

    canvas.after(10, update)
    root.mainloop()

if __name__ == '__main__':
    main()
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 15. März 2008, 19:48

@BlackJack:
Hat es einen besonderen Grund, dass du in Zeile 16 nicht einfach nur

Code: Alles auswählen

update()
aufrufst?
BlackJack

Samstag 15. März 2008, 20:16

Nein. Ich hab's bloss abgeschrieben ohne nach zu denken. :-)
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Samstag 15. März 2008, 20:19

Naja, zur Rettung stellen wir uns einfach vor, dass in der "update"-Funktion ein blockierender Aufruf drinsteckt, der nur darauf wartet, dass in der Mainloop irgend etwas passiert ;-)
Benutzeravatar
Tristan2
User
Beiträge: 3
Registriert: Samstag 15. März 2008, 18:07

Samstag 15. März 2008, 21:06

Suuuuper, danke BlackJack und pütone.

Hab schon seit Tagen im Netz herumgestöbert und nichts gefunden (bzw. verstanden). Werde gleich mal deinen Code Zeile für Zeile auseinander nehmen und "analysieren" :)

Betreff OOP befinde ich mich im Buch "Einführung in Python" vom O'Reilly Verlag erst auf Seite 157 ... das dauert noch ... liest sich nicht so schnell wie ein Roman.

Als nächstes werde ich versuchen die Soundausgabe über tkSnack mit deinem Code zu verbinden.

Nochmals, danke für die schnelle Hilfe.

Gruß
Tristan
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 15. März 2008, 22:15

Tristan2 hat geschrieben:Suuuuper, danke BlackJack und pütone.
Danke für die freundliche Erwähnung, aber ich habe hier echt nix geleistet ...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 15. März 2008, 22:50

Tristan2 hat geschrieben:Betreff OOP befinde ich mich im Buch "Einführung in Python" vom O'Reilly Verlag erst auf Seite 157 ... das dauert noch ... liest sich nicht so schnell wie ein Roman.
Insbesondere die ersten paar Kapitel kann man überspringen und später lesen (wenn überhaupt) - das Kapitel zu OOP solltest du dir aber möglichst bald ansehen, sonst wirst du wenig freude an dem ganzen haben. Zum Glück ist es eigentlich nicht schwer :)

Das ist eben ein Problem, dass die Bücher so unglaublich dick werden müssen mit jeder Auflage, ohne dass das von der Sprache her gerechtfertigt ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Tristan2
User
Beiträge: 3
Registriert: Samstag 15. März 2008, 18:07

Samstag 15. März 2008, 23:07

Ja du hast recht. Die ersten Kapitel lesen sich sehr zäh. Viel Grundlegendes aber wenig was Spaß macht (Grafik, Sound und so).

Ich schau mich mal nach einem Tkinter Tutorium um.

Gruß
Tristan
Antworten