Связывание ключей Tkinter в разных областях окна - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь сделать программу Tic Tac Toe для 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()

Извините, если я неправильно отформатировал код.Вторая, последняя строка - это строка, с которой у меня проблемы.Я хочу, чтобы кнопка-1 (щелчок мыши) могла выполнять функции x1 и x2 (и, в конечном итоге, другие функции) в зависимости от области окна, в котором она находится.Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Вот как вы можете использовать координаты событий, чтобы определить, на каком квадрате крестики-нолики щелкнул пользователь:

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 , которая рисует две диагонали для этого квадрата.

Надеюсь, что это поможет.

0 голосов
/ 18 октября 2018

Когда функция x1 вызывается в ответ на щелчок мыши, объект события имеет координаты мыши x и y (event.x и event.y).Используйте их, чтобы определить, какая часть холста была нажата, и действовать соответственно.

...