【问题标题】:Program saying the ".move" function does not exist程序说“.move”功能不存在
【发布时间】:2020-03-18 14:37:29
【问题描述】:

我有一些代码可以让一个具有特定大小位置和颜色的圆圈在屏幕上四处移动。这是我第一次尝试用对象做这样的事情,因为我第一次这样做是我硬编码的。

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 变量更改为playerdisplay 变量,但它仍然不起作用。

在 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()

现在虽然没有错误,但圆圈不会移动。怎么了?

【问题讨论】:

  • 应该是display.move(...) 而不是window.move(...)
  • @acw1668 我试过了,还是不行。
  • player = display.create_oval(...) 将覆盖player = Head(...)
  • 您需要在画布上调用.move(),而不是在窗口上。我怀疑当您尝试它时不起作用的原因是您试图使用名称 player 来引用两个完全不同的东西 - 当您实际尝试移动某个不再具有 @ 的东西时有效的那个987654333@ 属性。
  • mover=player 应该是mover=drawn_player

标签: python python-3.x tkinter


【解决方案1】:

除了在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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2012-06-15
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多