2016-05-05 15 views
1

キャンバス上に作成されたTk矩形をクリックして色を変更しようとしています。今、四角形をクリックすると色の変化は起こりません。私は別のことをするために何が必要ですか?Tkを使用してPythonのクリック時に矩形の色を変更する

これはPython3.5にあります。

from tkinter import * 


def set_color(id): 
    global alive, colors 
    alive = not alive 
    col = colors[alive] 
    canvas.itemconfigure(id, fill=col) 

root = Tk() 
canvas = Canvas(root) 
canvas.grid(column=1, row=1, sticky=(N, S, E, W)) 

alive = False 
colors = {True: "green", False: "red"} 

id = canvas.create_rectangle((1, 1, 60, 60), fill="red") 
canvas.tag_bind(id, "<ButtonPress-1>", set_color) 


root.mainloop() 

答えて

2

クラスにラップし、必要な数だけインスタンスを作成します。 http://www.freenetpages.co.uk/hp/alan.gauld/tutclass.htm

class OneSquare(): 
    def __init__(self, can, start_x, start_y, size): 
     self.can=can 
     self.id = self.can.create_rectangle((start_x, start_y, 
        start_x+size, start_y+size), fill="red") 
     self.can.tag_bind(self.id, "<ButtonPress-1>", self.set_color) 

     self.color_change=True 

    def set_color(self, event=None): 
     self.color_change = not self.color_change 
     color="red" 
     if not self.color_change: 
      color="green" 
     self.can.itemconfigure(self.id, fill=color) 

root = Tk() 
canvas = Canvas(root) 
canvas.grid(column=1, row=1, sticky=(N, S, E, W)) 

OS1=OneSquare(canvas, 1, 1, 60) 
OS2=OneSquare(canvas, 90, 1, 30) 
OS3=OneSquare(canvas, 1, 90, 90) 

Button(root, text="Exit", bg="orange", 
     command=root.quit).grid(row=2) 

root.mainloop() 
3

tag_bindはイベントを関数に送信するので、 "id"は上書きされ、イベントが含まれます。だから、

def set_color(id): 
## to 
def set_color(event=None): 

から変更することができますし、このプログラムに対処する1つのオブジェクトのみ/ idがありますので、それが動作します。 event = Noneは、ボタンが押されたときのように、イベントが関数に送られないときにデフォルト値を割り当てるので、すべての応答に対して機能します。

+0

甘い、ありがとう!そして、もし私がスクリーン上に複数の長方形を持っていたいなら、イベントを特定の四角形にバインドする方法は? –

関連する問題