Python canvas.coords不更新所有条目
我必须用Python制作一个“鱼缸”,它使用Tkinter中的画布。在里面,我需要一条鱼,它可以通过按下一个按钮来产卵,并且可以沿着dx,dy的方向移动,其中dx和dy都是为每个产卵的鱼生成的-3到3之间的随机值。一旦它们接近坦克的边缘,它们就会朝相反的方向反弹(就像DVD屏幕保护程序一样) 以下是我目前掌握的代码:Python canvas.coords不更新所有条目,python,tkinter,Python,Tkinter,我必须用Python制作一个“鱼缸”,它使用Tkinter中的画布。在里面,我需要一条鱼,它可以通过按下一个按钮来产卵,并且可以沿着dx,dy的方向移动,其中dx和dy都是为每个产卵的鱼生成的-3到3之间的随机值。一旦它们接近坦克的边缘,它们就会朝相反的方向反弹(就像DVD屏幕保护程序一样) 以下是我目前掌握的代码: import time import random from Tkinter import * tank = Tk() tank.title("Fish Tank") tank
import time
import random
from Tkinter import *
tank = Tk()
tank.title("Fish Tank")
tankwidth = 700 # (the background image is 700 by 525)
tankheight = 525
x = tankwidth/2
y = tankheight/2
fishwidth = 78 # (the fish image is 78 by 92)
fishheight = 92
fishx = fishwidth/2
fishy = fishheight/2
dx = 0
dy = 0
canvas = Canvas(tank,width=tankwidth,height=tankheight)
canvas.grid(row=0, column=0, columnspan=3)
bg = PhotoImage(file = "tank.gif")
left = PhotoImage(file = "fishleft.gif")
right = PhotoImage(file = "fishright.gif")
background = canvas.create_image(x,y,image=bg)
rightfish = canvas.create_image(-1234,-1234, image=right)
leftfish = canvas.create_image(-1234,-1234, image=left)
def newfish():
x = random.randrange(fishx+5, tankwidth-(fishx+5)) # +5 here so even the biggest dx or dy
y = random.randrange(fishy+5, tankheight-(fishy+5)) # won't get stuck between the border
dx = random.randrange(-3,4)
dy = random.randrange(-3,4)
leftfish = canvas.create_image(x,y, image=left)
rightfish = canvas.create_image(-1234,-1234, image=right)
updatefish(leftfish,rightfish,x,y,dx,dy)
def updatefish(left,right,x,y,dx,dy):
x += dx
y += dy
if dx < 0:
whichfish = left
canvas.coords(right,-1234,-1234)
if dx > 0:
whichfish = right
canvas.coords(left,-1234,-1234)
if x < fishx or x > tankwidth-fishx:
dx = -dx
if y < fishy or y > tankheight-fishy:
dy = -dy
print x, y, dx, dy
canvas.coords(whichfish, x,y)
canvas.after(100, updatefish, leftfish,rightfish,x,y,dx,dy)
newfish()
new = Button(tank, text="Add Another Fish", command=newfish)
new.grid(row=1,column=1,sticky="NS")
tank.mainloop()
有了它,当我产卵一条鱼时,一条鱼的实例将停留在它产卵的地方,另一条鱼将按照它的预期移动。如果没有它,我会得到“UnboundLocalError:local变量'whichfish'在赋值之前被引用”或错误,抱怨leftfish或rightfish不存在,即使它们在updatefish()中使用之前已经生成并出现在newfish()中。所以,我可以产卵,但它们不会动
和这里的很多东西相比,这是一个小联盟,但任何帮助都将不胜感激。感谢您的
未绑定本地错误:在赋值之前引用的本地变量“whichfish”
出现问题,因为dx
和dy
允许值0
,但如果dx
和dy
不为零,则只为whichfish
赋值
解决此问题的一种方法是:用以下语句替换randrange
语句:
dx = random.choice([-3, -2, -1, 1, 2, 3])
dy = random.choice([-3, -2, -1, 1, 2, 3])
至于为什么会有不动的鱼:
将左右鱼的图像指定给whichfish
,然后使用whichfish
作为鱼的画布ID。请尝试以下方法:
whichfish = leftfish
而不是
whichfish = left
同样地,对于rightfish
。你还将遇到其他一些问题,但这是最直接的问题
whichfish = left