Как получить координаты мыши как переменную? - PullRequest
1 голос
/ 27 февраля 2020
import tkinter as tk


field = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]


class Game:
    def click_coordinates(event):
        x = str(event.x)
        y = str(event.y)
        print(x, y)

    root = tk.Tk()
    root.title("Tic Tac Toe")
    root.geometry("304x304")
    my_canvas = tk.Canvas(root, width=300, height=300, background="black")
    my_canvas.grid(row=0, column=0)
    my_canvas.create_line(100, 0, 100, 305, fill="white", width=3)
    my_canvas.create_line(200, 0, 200, 305, fill="white", width=3)
    my_canvas.create_line(0, 100, 305, 100, fill="white", width=3)
    my_canvas.create_line(0, 200, 305, 200, fill="white", width=3)
    my_canvas.bind("<Button-1>", click_coordinates)

    root.mainloop()


if __name__ == "__main__":
    game = Game()

Моя проблема в том, что я хочу вернуть координаты мыши в виде переменной. Я пытался написать:

def click_coordinates(event):
    x = str(event.x)
    y = str(event.y)
    mouse = x + ":" + y
    return mouse

Но я понятия не имею, как я могу достичь этой переменной с другими функциями. Если я хочу вызвать другую функцию из функции click_coordinates(), я получаю сообщение об ошибке, что имя новой функции, которую я хочу вызвать, не определено. Кажется, я могу печатать только координаты.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы должны установить глобальную переменную или переменную экземпляра, если хотите получить доступ к значениям вне обратного вызова. Поскольку вы используете класс (хотя и используете его неправильно 1 ), переменная экземпляра является естественным выбором:

Пример:

def click_coordinates(self, event):
    self.last_x = event.x
    self.last_y = event.y

Затем можно сослаться self.last_x и self.last_y где-нибудь еще в вашем объекте. Было бы неплохо инициализировать их в None в __init__ класса:

class Game:
    def __init__(self):
        self.last_x = self.last_y = None
        ...

1 Вы должны переместить весь код внутри __init__, а не прямо под class Game. Кроме того, click_coordinates требуется аргумент self и на него следует ссылаться как self.click_coordinates.

class Game:
    def __init__(self):
        root = tk.Tk()
        ...
        my_canvas.bind("<Button-1>", self.click_coordinates)

    def click_coordinates(self, event):
        ...
0 голосов
/ 13 апреля 2020

Я просто хочу сообщить вам, что вам лучше заменить холст кнопками, я уверен, что это будет проще, потому что у кнопок есть команда, вам лучше сделать что-то вроде этого:

`b1=Button(win,font=("Arial Bold", 
50),width=3,bg='white',fg='SteelBlue',command=add1)
lst
b1.grid(row=2,column=1)
b2=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add2)
lst
b2.grid(row=2,column=2)
b3=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add3)
lst
b3.grid(row=2,column=3)
b4=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add4)
lst
b4.grid(row=3,column=1)
b5=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add5)
lst
b5.grid(row=3,column=2)
b6=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add6)
lst
b6.grid(row=3,column=3)
b7=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add7)
lst
b7.grid(row=4,column=1)
b8=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add8)
lst
b8.grid(row=4,column=2)
b9=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add9)
lst
b9.grid(row=4,column=3)`

и затем определить 9 функции и если вы хотите играть против компьютера или против другого игрока (не очень хорошо, потому что это очень просто) и если вы хотите быть сильным, просто поиграйте с этим кодом -_-.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...