Vorbereitung fuer ein Wellenprogramm

Fragen zu Tkinter.
Antworten
lemmi
User
Beiträge: 19
Registriert: Dienstag 28. März 2006, 17:45

hi,

hab vor kurzem es endlich geschafft mir eine vernuenftige
pythonlektuere zu kaufen und bin jetzt bei gui programmierung gelandet.

da wir in phyik immo wellen durchnehmen und interferenzen.
jedenfalls habe ich vor ein script zum simulieren solcher interferenzen
bei 2 oder mehr zentren zu schreiben.

bisher bin ich so weit gekommen:
das script laesst die weisse flaeche auf knopfdruck sinusartig dunkler werden und wieder aufhellen,
praktisch wie ein einzelner punkt auf einer welle, der sich auf und ab bewegt (je heller desto hoeher)

ich hab zuerst alles normal geschrieben und dann in eine klasse gepackt,
aber ich fuehl mich nicht ganz so wohl dabei, so viele "self"s und beenden
kann man das script auch nicht schoen, es haengt sich bei mir dann immer auf.
die funktion getColor ist gewollt fuer alle farben ausgelegt,
obwohl ich nur graustufen brauche, aber spezieller kann ich immernoch werden.

generell waeren ein paar tips ganz nett und vielleicht ein hinweis, wie ich denn
mein projekt ueberhaupt sinnvoll weiterfuehren soll.
danke schon mal im vorraus.

Code: Alles auswählen

from Tkinter import *
from math import cos

class SW_test(object):
    def __init__(self, freq=0.002):
        self.freq = freq
        self.an = self.winkel = 0   #winkel der cosinusfunktion
                                    #an/ausschaltvariable
        self.fenster = Tk()
        self.SWlabel = Label(self.fenster, width = 100, \
                             height = 10, bg = "#ffffff")
        self.SWlabel.pack()
        self.schalter = Button(self.fenster, text="Helligkeitswechsel An/Aus", \
                               command = self.farbwechsel)
        self.schalter.pack()

    def getColor(self, r, g, b):
        red = hex(r).lstrip("0x").zfill(2)      #wandle in hex um, entferne '0x'
        green = hex(g).lstrip("0x").zfill(2)    #und fuelle fehlende nullen auf
        blue = hex(b).lstrip("0x").zfill(2)
        return "#" + red + green + blue         #gebe im format #rrggbb zurueck

    def farbwechsel(self):
        self.an = 1 - self.an                       #schaltet an zwischen 0 und 1 um
        while self.an:                              #solange an:
            self.col = int(127 * (1 + cos(self.winkel)))             #erzeuge wert fuer die graustufe
            self.col = self.getColor(self.col, self.col, self.col)   #hole hex-farbcode
            self.winkel += self.freq               #winkel erhoehen (hoehere zahl, hoehere frequenz
            self.SWlabel.config(bg=self.col)        #hintergrundfarbe aktualisieren  
            self.fenster.update()                   #label neu zeichnen

    def start(self):
        self.fenster.mainloop()

if __name__ == '__main__':
    helligkeitstest = SW_test(0.002)     #geschwindigkeit
    helligkeitstest.start()
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Spontan fällt mir ein:

Code: Alles auswählen

    def getColor(self, r, g, b):
        return '#%02X%02X%02X' % (r, g, b)
Den Absturz beim Beenden könnte man z.B. so verhindern:
1. In __init__ einfügen:

Code: Alles auswählen

        self.fenster.protocol('WM_DELETE_WINDOW', self.finish)
2. Neue Methode

Code: Alles auswählen

    def finish(self):
        self.an = False
        self.fenster.quit()
        self.fenster.destroy()
MfG
HWK
lemmi
User
Beiträge: 19
Registriert: Dienstag 28. März 2006, 17:45

hey danke.
also deine art der getColor funktion ist knapp doppelt so schnell und beenden laessts sich jetzt auch vernuenftig.

kleines update: (die buttons sind noch alle ungeordet.. kommt noch wenn ich so weit bin ^^)

Code: Alles auswählen

from Tkinter import *
from math import cos

class SW_test(object):
    def __init__(self, freq=0.002):
        self.freq = freq
        self.an = self.winkel = 0   #winkel der cosinusfunktion
                                    #an/ausschaltvariable
        self.fenster = Tk()
        self.SWlabel = Label(self.fenster, width = 100, \
                             height = 10, bg = "#ffffff")
        self.SWlabel.pack()
        self.schalter = Button(self.fenster, text="Helligkeitswechsel An/Aus", \
                               command = self.farbwechsel)
        self.schalter.pack(side="right")
        self.ende = Button(self.fenster, text="Ende", command = self.finish)
        self.ende.pack(side="right")
        self.plus = Button(self.fenster, text="+", command = self.plus)
        self.plus.pack()
        self.minus = Button(self.fenster, text="-", command = self.minus)
        self.minus.pack()
        self.fenster.protocol('WM_DELETE_WINDOW', self.finish)

    def plus(self):
        self.freq *= 1.1

    def minus(self):
        self.freq /= 1.1

    def finish(self):
        self.an = False
        self.fenster.quit()
        self.fenster.destroy()
        
    def getColor(self, r, g, b):
        return '#%02X%02X%02X' % (r, g, b)  #gebe im format #rrggbb zurueck

    def farbwechsel(self):
        self.an = 1 - self.an                       #schaltet an zwischen 0 und 1 um
        while self.an:                              #solange an:
            self.col = int(127 * (1 + cos(self.winkel)))             #erzeuge wert fuer die graustufe
            self.col = self.getColor(self.col, self.col, self.col)   #hole hex-farbcode
            self.winkel += self.freq               #winkel erhoehen (hoehere zahl, hoehere frequenz
            self.SWlabel.config(bg=self.col)        #hintergrundfarbe aktualisieren  
            self.fenster.update()                   #label neu zeichnen

    def start(self):
        self.fenster.mainloop()

if __name__ == '__main__':
    helligkeitstest = SW_test(0.002)     #geschwindigkeit
    helligkeitstest.start()
Antworten