我正在尝试为 2 个玩家制作一个 Tic Tac Toe 程序,因此我需要能够在窗口的某些区域单击鼠标来执行不同的操作。我怎么做?这是我到目前为止所拥有的。
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()
抱歉,如果我的代码格式错误。倒数第二行是我遇到问题的行。我希望按钮 1(鼠标单击)能够执行 x1 和 x2(以及最终的其他功能),具体取决于它所在的窗口区域。请帮忙。
最佳答案
以下是如何使用事件坐标来识别用户单击了井字游戏板上的哪个方 block :
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()
首先,我使用变量宽度和第三对板尺寸进行参数化 - 只需更改宽度,所有内容都会正确调整大小。
其次,单击 Canvas 上的鼠标按钮会调用 mouse_click 事件处理程序,该处理程序获取 Canvas 中单击鼠标的点的坐标(event.x 和 event.x)。 y),并计算 tic-tac-tow 板上正方形的相应行(0、1 或 2)和列(0、1 或 2)。然后将它们作为参数传递给函数 draw_cross,该函数绘制该正方形的两条对角线。
希望有帮助。
关于python - 窗口不同区域中的 Tkinter 键绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52867418/