【发布时间】: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 变量更改为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()
现在虽然没有错误,但圆圈不会移动。怎么了?
【问题讨论】:
-
应该是
display.move(...)而不是window.move(...)。 -
@acw1668 我试过了,还是不行。
-
而
player = display.create_oval(...)将覆盖player = Head(...)。 -
您需要在画布上调用
.move(),而不是在窗口上。我怀疑当您尝试它时不起作用的原因是您试图使用名称player来引用两个完全不同的东西 - 当您实际尝试移动某个不再具有 @ 的东西时有效的那个987654333@ 属性。 -
mover=player应该是mover=drawn_player。
标签: python python-3.x tkinter