""" capellaScript -- Copyright (c) 2004 >>> Noten nach Tonhöhe färben Einzelnoten werden abhängig von Tonhöhe gefärbt. Mit Farbauswahldialog <<< Die vorhandene Farbvorgabe ist aus dem Script "Bunte Noten" entnommen. Für die Anregung und die Farbliste herzlichen Dank an Herrn Hartmut Ring Geplant ist eine Datei zu integrieren, in der beliebige Farbschemen gespeichert sein können, da nicht alle Kinderinstrumente eine einheitliche Farbgebung haben. """ from Tkinter import * from Canvas import * def HexFarbe(R,G,B): hexd= "0123456789ABCDEF" return "#"+hexd[R/16] + hexd[R%16]+hexd[G/16] + hexd[G%16]+hexd[B/16] + hexd[B%16] def HexFarbe_T(F): hexd= "0123456789ABCDEF" return "#"+hexd[F[0]/16] + hexd[F[0]%16]+hexd[F[1]/16] + hexd[F[1]%16]+hexd[F[2]/16] + hexd[F[2]%16] def FarbZahl(RGB): return 256*((256*RGB[2])+RGB[1])+RGB[0] class c_Note: def __init__(self, cv): self.Farbe=(0, 0, 0) self.cv=cv self.Kopf = Oval(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe), outline=HexFarbe_T(self.Farbe)) self.Hals = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe)) self.Kreuz1 = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe)) self.Kreuz2 = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe)) self.Kreuz3 = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe)) self.Kreuz4 = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe)) def SetzeFarbe(self,RGB): self.Farbe=RGB #print "Eingabe:", RGB, "Gesetzt:", self.Farbe self.Kopf["fill"]=HexFarbe_T(self.Farbe) self.Kopf["outline"]=HexFarbe_T(self.Farbe) self.Hals["fill"]=HexFarbe_T(self.Farbe) self.Kreuz1["fill"]=HexFarbe_T(self.Farbe) self.Kreuz2["fill"]=HexFarbe_T(self.Farbe) self.Kreuz3["fill"]=HexFarbe_T(self.Farbe) self.Kreuz4["fill"]=HexFarbe_T(self.Farbe) self.cv.update() def GebeFarbe(self): return self.Farbe def GebeFarbeHex(self): return HexFarbe_T(self.Farbe) def MaleNote(self, x, y, Farbe, Kreuz): self.Farbe=Farbe self.Kopf = Oval(self.cv, (x-10, y-10),(x ,y),fill=HexFarbe_T(self.Farbe), outline=HexFarbe_T(self.Farbe)) self.Hals = Line(self.cv, (x, y-5),(x, y-30),fill=HexFarbe_T(self.Farbe), width=2) if Kreuz== 1: self.Kreuz1 = Line(self.cv, (x-15, y+2),(x-15, y-15),fill=HexFarbe_T(self.Farbe), width=2) self.Kreuz2 = Line(self.cv, (x-20, y+2),(x-20, y-15),fill=HexFarbe_T(self.Farbe), width=2) self.Kreuz3 = Line(self.cv, (x-13, y-9),(x-22, y-7),fill=HexFarbe_T(self.Farbe), width=2) self.Kreuz4 = Line(self.cv, (x-13, y-5),(x-22, y-3),fill=HexFarbe_T(self.Farbe), width=2) def RahmenXY(Parent, Typ, Rahmen, Hoehe, Breite, HGFarbe, Seite): if Typ== "R": Rahmen= Frame(Parent, borderwidth=Rahmen, height=Hoehe, width=Breite, background=HGFarbe) else: Rahmen= Canvas(Parent, borderwidth=Rahmen, height=Hoehe, width=Breite, background=HGFarbe) Rahmen.pack(side=Seite, expand=NO) return Rahmen class MyApp: def __init__(self,parent, NotenBlatt): self.ROT=0 self.GRUEN=0 self.BLAU=0 self.NotenBlatt = NotenBlatt self.Noten_Namen = ["C", "CD", "D", "DE", "E", "F", "FG", "G", "GA", "A", "AH", "H"] self.FarbenListe=[(255, 0, 0),# rot (255,128, 0),# orange (255,192, 0),# orangegelb (255,255, 0),# gelb (160,255, 0),# gelbgelbgrün (128,255, 0),# gelbgrün ( 0,224, 0),# grün ( 0,112,128),# blaugrün ( 0, 64,192),# grünblau ( 0, 0,255),# blau ( 96, 0,160),# violett (224, 0, 80)]# rotviolett #print "Aktuelle Auflösung:", parent.winfo_vrootwidth(), "x", parent.winfo_vrootheight() self.myParent = parent self.myParent.geometry("640x400") #Abmessungen des Fensters festlegen #Rahmen um Alles, legt Arbeitsfläche fest Rahmen_Alles = Frame(parent, borderwidth=5, background="gray") Rahmen_Alles.pack(expand=YES, fill=BOTH) #linker Teil die Musternoten, rechter Teil die Farbauswahl Rahmen_Rechts = RahmenXY(Rahmen_Alles, "R", 5, 300, 150, "gray", RIGHT) Rahmen_Links = RahmenXY(Rahmen_Alles, "R", 5, 0, 200, "gray", RIGHT) # Rechts: oben: Musterfläche; Mitte: Eingabefelder; unten: Schaltfläche Rechts_Oben = RahmenXY(Rahmen_Rechts, "Z", 0, 90, 90, "white", TOP) self.MusterFarbe = Rectangle(Rechts_Oben, (10,10),(80,80),fill=HexFarbe(self.ROT, self.GRUEN, self.BLAU), outline="white") self.MusterFarbe["fill"]=HexFarbe(self.ROT, self.GRUEN, self.BLAU) Rechts_Mitte = RahmenXY(Rahmen_Rechts, "R", 5, 0, 150,"gray", TOP) Rechts_Unten = RahmenXY(Rahmen_Rechts, "R", 5, 0, 150,"gray", TOP) #Eingabefelder für die Farbwerte self.eingabe_r = self.EingabeFeld(Rechts_Mitte, "red") self.eingabe_g = self.EingabeFeld(Rechts_Mitte, "green") self.eingabe_b = self.EingabeFeld(Rechts_Mitte, "blue") # links: Oben: Überschrift; Mitte: Notenmuster; unten1: Schaltflächen für die Noten # unten2: Schaltflächen für das Formular Links_Oben = RahmenXY(Rahmen_Links, "R", 5, 20, 0, "gray", TOP) #, background="yellow") ### Links_Mitte = RahmenXY(Rahmen_Links, "Z", 5, 80, 420, "gray", TOP) Links_Unten = RahmenXY(Rahmen_Links, "R", 5, 50, 420, "gray", TOP) Links_Unten2 = RahmenXY(Rahmen_Links, "R", 5, 0, 0, "gray", TOP) myMessage="Farbauswahl für farbige Noten" Label(Links_Oben, text=myMessage, justify=LEFT).pack(side=TOP, anchor=W) self.NoteC =c_Note(Links_Mitte) self.NoteCD=c_Note(Links_Mitte) self.NoteD =c_Note(Links_Mitte) self.NoteDE=c_Note(Links_Mitte) self.NoteE =c_Note(Links_Mitte) self.NoteF =c_Note(Links_Mitte) self.NoteFG=c_Note(Links_Mitte) self.NoteG =c_Note(Links_Mitte) self.NoteGA=c_Note(Links_Mitte) self.NoteA =c_Note(Links_Mitte) self.NoteAH=c_Note(Links_Mitte) self.NoteH =c_Note(Links_Mitte) self.Noten_Name = StringVar() self.Noten_Name.set("C") self.Note_Mit_Name = {"A":self.NoteA, "H":self.NoteH, "C":self.NoteC, "D":self.NoteD, "E":self.NoteE, "F":self.NoteF, "G":self.NoteG, "CD":self.NoteCD, "DE":self.NoteDE, "FG":self.NoteFG, "GA":self.NoteGA, "AH":self.NoteAH} #Notenlinien malen for i in range(5): n1 = Line(Links_Mitte, (5,20+10*i),(415,20+10*i),fill="#000000", width=2) n1 = Line(Links_Mitte, (5,20+10*5),(75,20+10*5),fill="#000000", width=2) #alle 12 Noten färben, einzeichnen und die Schaltfläche dazu erzeugen i2 = -1 for i in range(12): Farbe=HexFarbe(self.FarbenListe[i][0],self.FarbenListe[i][1],self.FarbenListe[i][2]) i2 += 1 #print "zahlen:", i, i2 if len(self.Noten_Namen[i]) > 1: i2 -= 1 self.Note_Mit_Name[self.Noten_Namen[i]].MaleNote(30+34*i, 75-5*i2, self.FarbenListe[i],1) else: self.Note_Mit_Name[self.Noten_Namen[i]].MaleNote(30+34*i, 75-5*i2, self.FarbenListe[i],0) button = Radiobutton(Links_Unten, text=str(self.Noten_Namen[i]), indicatoron=0, value=self.Noten_Namen[i], command=self.Note_refresh, variable=self.Noten_Name, width = 4) button.pack(side=LEFT) self.Note_refresh() self.Schalter(Rechts_Unten, "F1", "Note färben") self.Schalter(Links_Unten2, "FQuit", "Beenden") self.Schalter(Links_Unten2, "F3", "Partitur färben") self.Schalter(Links_Unten2, "F4", "Färben mit Akkorden") self.Schalter(Links_Unten2, "F5", "Wiederherstellen") def Schalter(self, Rahmen, SName, SText): # command binding btn = Button(Rahmen, command = lambda arg1=SName:self.SchalterKlick(arg1)) # event binding -- passing the event as an argument btn.bind("", lambda event, arg1=SName: self.SchalterKlick1(event, arg1)) btn.configure(text=SText) #, background="gray") btn.pack(side=RIGHT, fill=None, padx=5, pady=5, ipadx=3, ipady=3) #return btn def SchalterKlick1(self, event, SName): self.SchalterKlick(SName) def SchalterKlick(self, SName): #print SName if SName =="F1": farbe=(self.ROT, self.GRUEN, self.BLAU) self.Note_Mit_Name[self.Noten_Name.get()].SetzeFarbe(farbe) elif SName =="FQuit": self.myParent.destroy() elif SName =="F3": for i in range(12): self.FarbenListe[i] = self.Note_Mit_Name[self.Noten_Namen[i]].GebeFarbe() for obj in self.NotenBlatt().noteObjs(): if obj.isChord() and obj.nHeads() == 1: pitch = obj.head(0).chromaticPitch() % 12 obj.setColor(FarbZahl(self.FarbenListe[pitch])) messageBox("Fertig", "Die Partitur wurde gefärbt") self.myParent.destroy() elif SName =="F4": for i in range(12): self.FarbenListe[i] = self.Note_Mit_Name[self.Noten_Namen[i]].GebeFarbe() for obj in self.NotenBlatt().noteObjs(): if obj.isChord() and obj.nHeads() > 0: pitch = obj.head(0).chromaticPitch() % 12 obj.setColor(FarbZahl(self.FarbenListe[pitch])) messageBox("Fertig", "Die Partitur wurde gefärbt") self.myParent.destroy() elif SName =="F5": for i in range(12): self.Note_Mit_Name[self.Noten_Namen[i]].SetzeFarbe(self.FarbenListe[i]) self.Note_refresh() pass def Note_refresh(self): Note = self.Note_Mit_Name[self.Noten_Name.get()] self.AktuelleFarbe = self.Note_Mit_Name[self.Noten_Name.get()].GebeFarbe() self.Setze(self.AktuelleFarbe[0], "red") self.Setze(self.AktuelleFarbe[1], "green") self.Setze(self.AktuelleFarbe[2], "blue") #print "Refresh:", self.Noten_Name.get(), self.AktuelleFarbe, self.Note_Mit_Name[self.Noten_Name.get()].GebeFarbe() def EingabeFeld(self, Rahmen, Farbe): iRahmen = RahmenXY(Rahmen, "R", 5, 0, 10, Farbe, LEFT) eingabe = Entry(iRahmen,width=4,background="white") eingabe.pack(fill=BOTH,expand=YES, side=LEFT) eingabe.bind("", lambda event, f=Farbe: self.TasteClick( event, f)) eingabe.bind("", lambda event, f=Farbe: self.TasteClick( event, f)) eingabe.bind("", lambda event, f=Farbe: self.TasteClick( event, f)) eingabe.bind("", lambda event, f=Farbe: self.TasteClick( event, f)) eingabe.bind("", lambda event, f=Farbe: self.TasteClick( event, f)) #eingabe.bind("", lambda event, f=Farbe: self.TasteClick( event, f)) return eingabe def Setze(self, Zahl, Farbe): #, Feld): try: Wert=0+Zahl except: Wert=0 if Wert >255: Wert=255 elif Wert < 0: Wert=0 if Farbe =="green": self.GRUEN= Wert self.eingabe_g.delete(0,20) self.eingabe_g.insert(0,Wert) elif Farbe =="red": self.ROT=Wert self.eingabe_r.delete(0,20) self.eingabe_r.insert(0,Wert) elif Farbe =="blue": self.BLAU=Wert self.eingabe_b.delete(0,20) self.eingabe_b.insert(0,Wert) self.MusterFarbe["fill"]=HexFarbe(self.ROT, self.GRUEN, self.BLAU) def Gebe(self, Farbe): Wert=0 if Farbe=="red": Wert=self.eingabe_r.get() elif Farbe=="green": Wert=self.eingabe_g.get() elif Farbe=="blue": Wert=self.eingabe_b.get() return Wert def TasteClick(self, event, Farbe): try: Wert = int(self.Gebe(Farbe)) except: Wert = 0 #print "Taste:", event.keysym , "Wert:", Wert, "Farbe:", Farbe if event.keysym == "Next": self.Setze(Wert-10,Farbe) elif event.keysym == "Prior": self.Setze(Wert+10,Farbe) elif event.keysym == "Up": self.Setze(Wert+1, Farbe) elif event.keysym == "Down": self.Setze(Wert-1, Farbe) else: self.Setze(Wert, Farbe) pass root = Tk() #activeScore= 12 # zum Testen in PYTHON root.wm_title("Farbige Noten") myapp = MyApp(root, activeScore) root.mainloop()