我需要将在一个函数中创建的变量用作另一个函数中的参数/参数。我不确定如何在没有连续错误信号的情况下这样做,因为我每10毫秒重复一次这个功能。这是代码:
def addFish():
x = createRandomX()
y = createRandomY()
Dx = createRandomDx()
Dy = createRandomDy()
fish = canvas.create_image(x, y, image = fishRight)
updateFish(x, y, Dx, Dy, fish)
return x, y, Dx, Dy, fish
fishButton = Button(root, text = "Add a fish", command = addFish)
fishButton.grid(row = 1, column = 0)
def updateFish(x, y, Dx, Dy, fish):
#global x, y, Dx, Dy, fish
canvas.coords(fish, x , y )
x = x + Dx
y = y + Dy
if x < 0 or x > 500:
Dx = Dx * -1
if y < 0 or y > 500:
Dy = Dy * -1
if Dx == 1:
canvas.itemconfig(fish, image=fishRight)
if Dx == -1:
canvas.itemconfig(fish, image=fishLeft)
canvas.after(10, updateFish(x, y, Dx, Dy, fish))
updateFish(x, y, Dx, Dy, fish)
root.mainloop()
所以,当我这样做时,我得到x未定义的错误。这是因为当我调用updateFish时,第一个参数x不是全局变量,它只是addFish()的局部变量。所以,我需要知道如何在函数updateFish中使用addFish()中的变量作为参数。
我正在建造一个鱼缸,让鱼连续不断地反弹,但是我需要updateFish功能来处理我添加的所有鱼 - 因此它需要是函数中的参数。
答案 0 :(得分:1)
问题是所有值都是按值传递的,因此在函数中更改它们不会更新函数调用中的原始变量:
>>> def test (x):
x = x * 10
>>> x = 20
>>> test(x)
>>> x
20
如果你想保持多条鱼的状态,我建议你创建一个鱼类:
class Fish (object):
def __init__ (self, x, y, dx, dy, canvas):
self.x = x
self.y = y
self.dx = dx
self.dy = dy
self.canvas = canvas
self.image = canvas.create_image(x, y, image=fishRight)
然后,您可以使用Fish(x, y, dx, dy, canvas)
创建一条鱼并拥有一个可以通过引用传递的对象。然后,更改该对象的值将全局更新值。
然后,您还可以移动类中的一些函数作为方法。例如。 updateFish
方法可能很适合班级。
答案 1 :(得分:0)
你知道closures吗?在封闭式函数foo
中定义fooMama
,foo
可以访问所有fooMama
的局部变量,即使在fooMama
返回后也是如此。
更好的解释:https://stackoverflow.com/a/4020443/2037637
[编辑]我意识到这并没有真正回答你的问题,但它至少可能有所帮助。