python - 窗口不同区域中的 Tkinter 键绑定(bind)

标签 python tkinter graphics tic-tac-toe 2d-games

我正在尝试为 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/

相关文章:

python - django 请求参数从 url 到 View 不起作用

python - 寻找最近的交叉路口时出现问题

python:将脚本工作目录更改为脚本自己的目录

python-3.x - 当使用 ttk 小部件时,tkinter 函数会重复两次

python - 如何从Python Tkinter应用程序捕获到控制台的任何输出?

python - Tkinter:在没有 create_oval 的情况下在 Canvas 上画一个圆圈

pdf - 使用 Inkscape 从 pdf 中提取矢量图形

python - 没有 Selenium 的网页解析

c++ - 将线剪裁到屏幕坐标

java - 如何使用KeyListener绘制不同的图像?