将函数的lambda绑定到键事件python

2024-09-28 22:35:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个小的绘画游戏,但它目前使用图形用户界面按钮,而不是阅读按键。在

我怎样才能使它读键按下有相同的输出与当前的图形用户界面按钮?在

我根本无法让键绑定事件工作。我是应该将它们绑定到其他东西上,还是只是写错了?在

(关于代码墙的事很抱歉,我尽量缩短了)

from tkinter import *

playerPos=0   
length=9
width=9


class GridTools:

#make a 2d array of Labels
    def __init__(self,root):
        self.grid=[]
        acc=-1# keep track of the number of loops. Will be 0 by the time
        #it's on a button

        for x in range (0,length):
            for y in range(0,width):
                acc+=1
                tile=Label(bg="black",fg="white",text=str(acc))
                self.grid.append(tile)
                tile.grid(row=x,column=y)
        PlayerTile.makePlayer(self.grid)#put player in the grid
    #add movement buttons
    #I still don't understand Lambdas
        moveUp= Button(text="up", command=lambda :PlayerTile.movePlayer(self.grid,"UP"))
        moveUp.grid(row=11, column=11)
        moveDown= Button(text="down", command=lambda :PlayerTile.movePlayer(self.grid,"DOWN"))
        moveDown.grid(row=13, column=11)
        moveLeft= Button(text="left", command=lambda :PlayerTile.movePlayer(self.grid,"LEFT"))
        moveLeft.grid(row=12, column=10)
        moveRight= Button(text="right", command=lambda :PlayerTile.movePlayer(self.grid,"RIGHT"))
        moveRight.grid(row=12, column=12)

    #this doesn't do anything
        moveUp.bind('<Up>',lambda: layerTile.movePlayer(self.grid,"UP"))

    #Manipulate the green player tile
class PlayerTile:
    def makePlayer(grid):
        global playerPos
        grid[playerPos].config(bg="green")

    def movePlayer(grid,direction):
        global playerPos

        if(direction=="UP" and playerPos>8):

            grid[playerPos].config(bg="grey")
            playerPos= playerPos -9
            grid[playerPos].config(bg="green")

        if(direction=="DOWN" and playerPos<(width-1)*length):

            grid[playerPos].config(bg="light blue")
            playerPos= playerPos +9
            grid[playerPos].config(bg="green")

        if(direction=="LEFT" and (playerPos)%length!=0):

            grid[playerPos].config(bg="light pink")
            playerPos= playerPos -1
            grid[playerPos].config(bg="green")

        if(direction=="RIGHT" and (playerPos+1)%length!=0):

            grid[playerPos].config(bg="light yellow")
            playerPos= playerPos +1
            grid[playerPos].config(bg="green")



root=Tk() 
x=GridTools(root)#initialilize the grid using GridTools' init function
root.mainloop()

Tags: thelambdatextselfconfigcolumngreenlength
1条回答
网友
1楼 · 发布于 2024-09-28 22:35:42

moveUp.bind('<Up>',lambda: layerTile.movePlayer(self.grid,"UP"))行中,您将Up键绑定到moveUp小部件。在

为了获得所需的效果,您需要将其绑定到root

root.bind('<Up>', lambda e: layerTile.movePlayer(self.grid,"UP"))

请注意,我将e(event)传递给lambda表达式。一个lambda表达式可以看作是一个内联函数,在这个函数中,无论何时调用它,都会对内容求值,并在冒号之前传递参数。在

如果您为每个箭头键复制这一行,那么您应该得到您想要的结果。在

相关问题 更多 >