我只是在学习python,我想创建一个小游戏,可以在其中上下左右移动对象...
import tkinter
canvas=tkinter.Canvas(width=800,height=600)
canvas.pack()
canvas.create_text(400,200,text='Starlight',font='Arial 100 bold')
canvas.create_text(400,325,text='Press a button to start the game',font='Arial 20')
a=400
b=500
def start(coordinates):
canvas.delete("all")
canvas.create_rectangle(a-20,b,a+20,b-50)
def moveright(coordinates2):
a=a+100
b=b+0
canvas.delete("all")
canvas.create_rectangle(a-20,b,a+20,b-50)
canvas.bind('<Button-1>',start)
canvas.bind('<Button-3>',start)
canvas.bind_all('<Right>',moveright)
我刚刚编写了右移动部分的程序,但是我遇到了一个问题,它没有看到a是400,但是如果我将其写入def,那么我只能将其移动到新位置一次,然后就停在那里。 ....对此有什么解决方案?
答案 0 :(得分:1)
当您在a
中更改b
和moveright
时,它变成本地的,因此下次调用moveright
时,a和b不再存在。 / p>
无需重新编写许多代码,就可以通过在a
中将b
和moveright
声明为全局变量来进行简单的修复,因此它们在{{1}之后仍然存在}终止:
moveright
由于def moveright(coordinates2):
global a
global b
a=a+100
b=b+0
canvas.delete("all")
canvas.create_rectangle(a-20,b,a+20,b-50)
和a
现在是全局的,因此它们在b
终止后仍然存在,并且可以在下一次对moveright
的调用中使用。
注意:这不是编写程序的最佳方法,只是最简单的修复程序,它也可以避免引起问题的原因。
答案 1 :(得分:0)
为了解决与movenent有关的问题,您将需要使用fail2ban
语句使函数知道您要使用的变量在全局名称空间中。
那就是说我会提倡一种OOP方法,以避免使用global。
通过将其构建为一个类并使用类属性,我们可以管理运动而无需全局操作。此外,如果我们将事件传递给类方法,则可以使用单个方法在所有四个方向上移动。
global