Python 如何使用我创建的网格中的w、a、s、d键确定玩家圆圈移动的位置

Python 如何使用我创建的网格中的w、a、s、d键确定玩家圆圈移动的位置,python,tkinter,Python,Tkinter,好的,我的最后一个项目是创建一个地下城爬虫,我在玩家移动的地方设置了一个网格,到目前为止,我正在完成GUI,然后将其余文件与攻击功能链接在一起。无论如何,我的问题是我的玩家圈不会在我创建的网格中移动,如果你不知道我的意思,下面是代码: gui.py try: from tkinter import * except ImportError as err: print('a', err) from player import * class SimpleGUI: de

好的,我的最后一个项目是创建一个地下城爬虫,我在玩家移动的地方设置了一个网格,到目前为止,我正在完成GUI,然后将其余文件与攻击功能链接在一起。无论如何,我的问题是我的玩家圈不会在我创建的网格中移动,如果你不知道我的意思,下面是代码:

gui.py

try:
    from tkinter import *

except ImportError as err:
    print('a', err)

from player import *

class SimpleGUI:
    def __init__(self):
        self.window = Tk()
        self.window.title('Final Project')
        self.window.protocol('WM_DELETE_WINDOW',self.exit)
        self.canvas = Canvas(self.window,
                             width = 245,
                             height = 550,
                             bg = 'white')
        self.canvas.pack()

        self.player = Player()

        self.canvas.focus_set()
        self.canvas.bind('w', self.w_key)
        self.canvas.bind('a', self.a_key)
        self.canvas.bind('s', self.s_key)
        self.canvas.bind('d', self.d_key)


        self.running = True
        self.menu = Menu

        self.bt1 = Button(self.window,
                         text = 'Start',
                         command = self.menu)
        self.bt1.pack()




        self.mainloop()
        self.window.mainloop()

    def mainloop(self):
        while self.running:
            self.canvas.delete(ALL)
            #boss square
            boss_start = self.canvas.create_rectangle(100,0,150,100, outline = 'black', fill = 'black', width = 2)
            #player start square
            ply_start = self.canvas.create_rectangle(100,500,150,550, outline = 'black', fill = 'black', width = 2)
            #row 9
            self.canvas.create_rectangle(0,50,50,100, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(50,50,100,100, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(100,50,150,100, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(150,50,200,100, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(200,50,250,100, outline = 'black', fill = 'black', width = 2)
            #row 8
            self.canvas.create_rectangle(0,100,50,150, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(50,100,100,150, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(100,100,150,150, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(150,100,200,150, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(200,100,250,150, outline = 'black', fill = 'black', width = 2)
            #row 7
            self.canvas.create_rectangle(0,150,50,200, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(50,150,100,200, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(100,150,150,200, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(150,150,200,200, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(200,150,250,200, outline = 'black', fill = 'black', width = 2)
            #row 6
            self.canvas.create_rectangle(0,200,50,250, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(50,200,100,250, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(100,200,150,250, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(150,200,200,250, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(200,200,250,250, outline = 'black', fill = 'black', width = 2)
            #row 5
            self.canvas.create_rectangle(0,250,50,300, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(50,250,100,300, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(100,250,150,300, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(150,250,200,300, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(200,250,250,300, outline = 'black', fill = 'black', width = 2)
            #row 4
            self.canvas.create_rectangle(0,300,50,350, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(50,300,100,350, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(100,300,150,350, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(150,300,200,350, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(200,300,250,350, outline = 'black', fill = 'black', width = 2)
            #row 3
            self.canvas.create_rectangle(0,350,50,400, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(50,350,100,400, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(100,350,150,400, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(150,350,200,400, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(200,350,250,400, outline = 'black', fill = 'black', width = 2)
            #row 2
            self.canvas.create_rectangle(0,400,50,450, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(50,400,100,450, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(100,400,150,450, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(150,400,200,450, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(200,400,250,450, outline = 'black', fill = 'black', width = 2)
            #row 1
            self.canvas.create_rectangle(0,450,50,500, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(50,450,100,500, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(100,450,150,500, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(150,450,200,500, outline = 'black', fill = 'black', width = 2)
            self.canvas.create_rectangle(200,450,250,500, outline = 'black', fill = 'black', width = 2)
            self.player.draw(self.canvas)

            self.canvas.after(30)
            self.canvas.update()

    def button1(self):
        print('working')

    def a_key(self, event):
        self.player.x -= self.player.speed

    def w_key(self, event):
        self.player.y -= self.player.speed

    def s_key(self, event):
        self.player.y += self.player.speed

    def d_key(self, event):
        self.player.x += self.player.speed

    def exit(self):
        self.running = False
        self.window.destroy()


if __name__ == '__main__':
    SimpleGUI()
player.py

class Player:
    def __init__(self, hp = 100, defense = 10, strength = 10):
        self.hp = hp
        self.defense = defense
        self.strength = strength
        self.x = 0
        self.y = 0
        self.speed = 64

    def draw(self, canvas): 
        canvas.create_oval(self.x,self.y,self.x+45,self.y+45, fill='red') 

if __name__ == '__main__':
    player = Player()

我不确定你的问题是什么。我复制了你的代码,当我运行你的项目时,红色的圆圈会随着wasd键适当移动。缺少适当的碰撞是问题吗?

这不是如何在tkinter中制作动画。您不应该用自己的while循环替换内置的
mainloop

要制作动画,请只绘制一次棋盘。然后,创建一个函数来更新电路板。最后,在之后定期调用该函数。这将允许您的UI响应,同时保持板的最新状态

换句话说,与此相反:

def mainloop():
    while self.running:
        ...
        self.canvas.after(30)
        self.canvas.update()
。。。你应该这样做:

def update_display():

    <update the display based on current information>

    if self.running:
        # update the screen again in 30 ms
        self.after(30, update_display)
def update_display():
如果自动运行:
#30毫秒后再次更新屏幕
self.after(30,更新显示)
对于“更新显示”部分,您可以使用canvas
move
和/或
coords
方法来移动椭圆。没有必要在每次迭代过程中删除并完全重新绘制——只需重新绘制已更改的内容即可。对玩家来说也是如此——画一次,然后再移动它


使用此体系结构,您的应用程序将执行得更好

对不起,我想让圆完全进入正方形,如果你把它一直移动到网格的右边,它会偏离几个像素。很抱歉搞混了问题是我需要圆正好进入网格上正方形的中间,只需编辑圆上的填充,将其从黑色改为白色,你就会更好地理解我的意思,而且,我需要找到一种方法,确保圆点只能进入黑色正方形,而不能进入其他任何地方,有什么好办法吗?@MylesTaft:你有没有试过简单地用一点数学来确保坐标按你想要的方式对齐?