Программа, говорящая, что функция ".move" не существует - PullRequest
0 голосов
/ 18 марта 2020

У меня есть код для создания круга с определенным размером и цветом, который перемещается по экрану. Это моя первая попытка сделать что-то подобное с объектами, так как в первый раз, когда я сделал это, я все это жестко закодировал.

import tkinter as tk


class Head:

    def __init__(self, location, color, size, speed):
        self.location = location
        self.color = color
        self.size = size
        self.speed = speed


player = Head([375, 375], "orange4", 75, 5)


def movement(event, mover):
    key = event.keysym
    if key == "Right":
        window.move(mover, player.speed, 0)
    elif key == "Left":
        window.move(mover, -player.speed, 0)
    elif key == "Up":
        window.move(mover, 0, -player.speed)
    elif key == "Down":
        window.move(mover, 0, player.speed)


window = tk.Tk()
window.title("Tour")
display = tk.Canvas(window, width=750, height=750)
display.pack()

player = display.create_oval((player.location[0] - (player.size / 2)), (player.location[1] - (player.size / 2)),
                             (player.location[0] + (player.size / 2)), (player.location[1] + (player.size / 2)),
                             fill=player.color)
window.bind_all("<Key>", lambda event: movement(event, mover=player))

window.mainloop()

Когда я запускаю этот код, я получаю ошибку AttributeError: '_tkinter.tkapp' object has no attribute 'move', когда пытаюсь переместить с помощью клавиш со стрелками. Я попытался изменить переменную window на переменные player и display, но она все еще не работала.

После того, что jasonharper и acw1668 сказали, что я изменил код на это:

import tkinter as tk


class Head:

    def __init__(self, location, color, size, speed):
        self.location = location
        self.color = color
        self.size = size
        self.speed = speed


player = Head([375, 375], "orange4", 75, 5)


def movement(event, mover):
    key = event.keysym
    if key == "Right":
        display.move(mover, player.speed, 0)
    elif key == "Left":
        display.move(mover, -player.speed, 0)
    elif key == "Up":
        display.move(mover, 0, -player.speed)
    elif key == "Down":
        display.move(mover, 0, player.speed)


window = tk.Tk()
window.title("Tour")
display = tk.Canvas(window, width=750, height=750)
display.pack()

drawn_player = display.create_oval((player.location[0] - (player.size / 2)), (player.location[1] - (player.size / 2)),
                             (player.location[0] + (player.size / 2)), (player.location[1] + (player.size / 2)),
                             fill=player.color)
window.bind_all("<Key>", lambda event: movement(event, mover=player))

window.mainloop()

Теперь пока ошибок нет, круг не двигается. Что не так?

1 Ответ

0 голосов
/ 18 марта 2020

Помимо проблемы со ссылкой на холст в функции movement(), у вас также есть две переменные с именем player, которые вызовут новую проблему. Я исправляю последнее, переименовывая второе в player_drawn и все ссылки на него.

Код теперь работает и перемещает овал.

import tkinter as tk


class Head:

    def __init__(self, location, color, size, speed):
        self.location = location
        self.color = color
        self.size = size
        self.speed = speed


player = Head([375, 375], "orange4", 75, 5)


def movement(event, mover):
    key = event.keysym
    if key == "Right":
        display.move(mover, player.speed, 0)
    elif key == "Left":
        display.move(mover, -player.speed, 0)
    elif key == "Up":
        display.move(mover, 0, -player.speed)
    elif key == "Down":
        display.move(mover, 0, player.speed)

window = tk.Tk()
window.title("Tour")
display = tk.Canvas(window, width=750, height=750)
display.pack()

drawn_player = display.create_oval((player.location[0] - (player.size / 2)),
                                   (player.location[1] - (player.size / 2)),
                                   (player.location[0] + (player.size / 2)),
                                   (player.location[1] + (player.size / 2)),
                                   fill=player.color)
window.bind_all("<Key>", lambda event: movement(event, mover=drawn_player))

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