我正在尝试为 2 名玩家制作一个井字游戏程序,所以我需要能够在窗口的某些区域单击鼠标做不同的事情。我该怎么做?这就是我目前所拥有的。
from tkinter import *
# Creates Window
tk = Tk()
canvas = Canvas(tk, width=600, height=600)
tk.title('Tic Tac Toe')
canvas.pack
# Creates Board
line1 = canvas.create_line(200, 0, 200, 600)
line2 = canvas.create_line(400, 0, 400, 600)
line3 = canvas.create_line(0, 200, 600, 200)
line4 = canvas.create_line(0, 400, 600, 400)
# Creates Functions for Xs being placed on board
def x1(event):
canvas.create_line(0, 0, 200, 200)
canvas.create_line(200, 0, 0, 200)
def x2(event):
canvas.create_line(200, 0, 400, 200)
canvas.create_line(400, 0, 200, 200)
# Creates the buttons to put the Xs on the board when clicked DOESN'T WORK
canvas.pack()
canvas.bind("<Button-1>", x1)
canvas.mainloop()
抱歉,如果我格式化错误的代码。倒数第二行是我遇到问题的行。我希望 button-1(鼠标单击(能够执行 x1 和 x2(以及最终的其他功能(,具体取决于它所在的窗口区域。请帮忙。
下面介绍如何使用事件坐标来识别用户单击的井字棋板的哪个方块:
from tkinter import *
# Creates Window
tk = Tk()
width = 600
third = width / 3
canvas = Canvas(tk, width=width, height=width)
tk.title('Tic Tac Toe')
canvas.pack
# Creates Board
canvas.create_line(third, 0, third, width)
canvas.create_line(third*2, 0, third*2, width)
canvas.create_line(0, third, width, third)
canvas.create_line(0, third*2, width, third*2)
def draw_cross(row,col):
canvas.create_line(col * third, row * third, (col + 1) * third, (row + 1) * third)
canvas.create_line((col + 1) * third, row * third, col * third, (row + 1) * third)
def mouse_click(event):
col = int(event.x / third)
row = int(event.y / third)
draw_cross(row,col)
canvas.pack()
canvas.bind("<Button-1>", mouse_click)
canvas.mainloop()
首先,我使用变量宽度参数化了电路板尺寸,第三- 只需更改宽度,一切都会正确调整大小。
其次,单击画布上的鼠标按钮将调用mouse_click事件处理程序,该处理程序获取画布中单击鼠标的点(event.x 和 event.y(的坐标,并计算井字拖板上正方形的相应行(0、1 或 2(和列(0、1 或 2(。然后将这些参数作为参数传递给函数draw_cross该函数绘制该正方形的两个对角线。
希望有帮助。
当调用函数 x1 以响应鼠标单击时,事件对象具有鼠标单击 x 和 y 坐标(event.x 和 event.y(。使用它们来检测单击了画布的哪个部分并采取相应的操作。