9.7.4 右键响应

按钮右键负责标记雷。
右键需要有以下逻辑:
1.右键点击一次标记,右键再点击一次就取消标记。
2.左键单击事件的函数取消。
标记这里提供两种小旗子:    
图片复制到和同一个文件夹,装载图片代码如下:
from PIL import ImageTk, Image
#以下几行代码必须在root=tk.Tk()后
image = Image.open("flag.png")#装载图片
resized_image = image.resize((29, 29))#设置图片大小,图片小一点以免盖住线
photo = ImageTk.PhotoImage(resized_image)

下面这个是右键响应,但只写了标记,并没有再点击一次取消标记的功能。
def right_click(event):
    canvas = event.widget
    #将事件坐标转换为画布坐标
    x, y = canvas.canvasx(event.x), canvas.canvasy(event.y)
    row, col = int(y // 30), int(x // 30)
    x, y = col * 30+1 , row * 30+1 //偏移一个像素,否则会盖住线不好看
    canvas.create_image(x, y, anchor="nw", image=photo)#nw表示x和y是左上角坐标,photo对象见上面的代码

还需要加上右键点击的时候,小旗子是否已经放置了,如果已经放置,那么就要取消。
但这里的机制和按钮是不一样的,第7行代码创建的图片已经覆盖了这个位置的方块了,但方块其实还存在,需要删除掉(第11、12行代码),还需要在创建的图片上绑定右键单击事件,这里用另一个函数right_click2:
def right_click(event):
    canvas = event.widget
    #将事件坐标转换为画布坐标
    x, y = canvas.canvasx(event.x), canvas.canvasy(event.y)
    row, col = int(y // 30), int(x // 30)
    x, y = col * 30+1 , row * 30+1 //偏移一个像素,否则会盖住线不好看
    img =canvas.create_image(x, y, anchor="nw", image=photo)#nw表示x和y是左上角坐标,photo对象见上面的代码
    img.bind("<Button-3",right_click2);
    
    #找到原来的方块删除掉,不删除掉多次右键点击会出bug
    rec_id = canvas.find_withtag("button_{}_{}".format(row, col))[0] 
    canvas.delete(rec_id)
然后是right_click2函数,这个是右键点击红色小旗子后执行的,应该重新画方块,小旗子在方块下方被覆盖,可以不删除:
def right_click2(event):
    canvas = event.widget
    x, y = canvas.canvasx(event.x), canvas.canvasy(event.y)
    row, col = int(y // 30), int(x // 30)
    x, y = col * 30 , row * 30
    #重新画方块
    rec = canvas.create_rectangle(x, y, x + 30, y + 30, fill="#ccc", outline="black",
                                     tags=("button_{}_{}".format(row, col),))
    #绑定同样的左键和右键响应函数
    canvas.tag_bind(rec, "<Button-1>", left_click)
    canvas.tag_bind(rec, "<Button-3>", right_click)