ピアノみたいなものを作成してみた。


高さを変えたらずいぶん印象が変わったのでupしなおす。

#!/usr/bin/env python

import Tkinter
import math
import sndPlay

class keyTk:
    def __init__(self,x1,y1,x2,y2,scale,A=440,color="white"):
        self.x1,self.y1,self.x2,self.y2,self.scale,self.A,self.color = x1,y1,x2,y2,scale,A,color

    def paint(self,canvas):
        self.rect = canvas.create_rectangle(self.x1,self.y1,self.x2,self.y2,
                                            outline='black',
                                            fill=self.color)
    def onClick(self):
        s = sndPlay.sndPlay()
        s.A = self.A
        s.addScale(self.scale,0.5)
        s.closeFile()
        
class pianoTk:
    def __init__(self):
        window = Tkinter.Tk()
        self.width = 800
        self.height = 200
        self.canvas = Tkinter.Canvas(window, bg="white",
                                     width=self.width,
                                     height=self.height)
        self.canvas.pack()
        self.canvas.bind("<ButtonPress-1>",self.pressCanvas)
        self.objects = []

        octaves = [0.5,1,2,3]
        for jj in range(len(octaves)):
            scales = [('A','white'),('AS','black'),('B','white'),('C','white'),('CS','black'),
                      ('D','white'),('DS','black'),('E','white'),('F','white'),('FS','black'),
                      ('G','white'),('GS','black'),]
            keyNum = len(scales)
            wid,hei = self.width/keyNum/len(octaves),self.height
            for ii in range(len(scales)):
                self.objects.append(keyTk((ii+len(scales)*jj)*wid,0,
                                          (ii+1+len(scales)*jj)*wid,hei,
                                          scales[ii][0],440*octaves[jj],
                                          scales[ii][1]))
        for o in self.objects:
            o.paint(self.canvas)
        self.window = window
        window.mainloop()

    def pressCanvas(self,event):
        for o in self.objects:
            if o.x1 <= event.x <= o.x2 and o.y1 <= event.y <= o.y2:
                o.onClick()
                break

pianoTk()

以前作成したsndPlayをimportするので、どっかに置いておく必要がある。