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)