Python tkinter-在Canvas中移动对象

时间:2018-11-13 22:48:44

标签: python tkinter tkinter-canvas

我只是在学习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,那么我只能将其移动到新位置一次,然后就停在那里。 ....对此有什么解决方案?

2 个答案:

答案 0 :(得分:1)

当您在a中更改bmoveright时,它变成本地的,因此下次调用moveright时,a和b不再存在。 / p>

无需重新编写许多代码,就可以通过在a中将bmoveright声明为全局变量来进行简单的修复,因此它们在{{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