Python 如何修复tkinter中的密钥绑定

Python 如何修复tkinter中的密钥绑定,python,python-3.x,tkinter,tkinter-canvas,Python,Python 3.x,Tkinter,Tkinter Canvas,我想让精灵在画布上四处移动,并尝试使用键绑定作为控件。当我运行程序时,它不会移动,直到我尝试正确的键。我用鼠标按键测试过,效果很好 添加代码: from tkinter import * class MainGame: def __init__(self): self.grid = [[""]*15 for n in range(15)] self.grid[14][3] = 1 print(self.grid) self

我想让精灵在画布上四处移动,并尝试使用键绑定作为控件。当我运行程序时,它不会移动,直到我尝试正确的键。我用鼠标按键测试过,效果很好

添加代码:

from tkinter import *

class MainGame:
    def __init__(self):
        self.grid = [[""]*15 for n in range(15)]
        self.grid[14][3] = 1
        print(self.grid)
        self.canvas = Canvas(root, width = 900, height = 900)
        self.canvas.pack()

        self.a, self.b = 45, 175

    def noreaction(self, event):
        print("It clicked")
        print(self.a)
        self.a += 50
        self.b += 50
        self.canvas.create_image(self.a, self.b, image = self.pl, tags = "p2Tag")
        self.canvas.delete("p1Tag")
        self.canvas.tag_bind("p2Tag", "<Key-q>", self.noreaction)

    def run(self):
        self.pl = PhotoImage(file = "player.png")
        self.canvas.create_image(self.a, self.b, image = self.pl, tags = "p1Tag")
        self.canvas.tag_bind("p1Tag", "<Key>", self.noreaction)

        self.x0, self.y0, self.x1, self.y1 = -30, 150, 20, 200

        for self.row in self.grid:
            for self.column in self.row:
                self.x0 += 50
                self.x1 += 50

                self.cell = self.canvas.create_rectangle(self.x0, self.y0, self.x1, self.y1)
            self.y0 += 50
            self.y1 += 50
            self.x0 = -30
            self.x1 = 20

root = Tk()
root.focus_set()
obj = MainGame()

obj.run()

root.mainloop()
从tkinter导入*
主要游戏类别:
定义初始化(自):
self.grid=[[“”]*15表示范围内的n(15)]
自网格[14][3]=1
打印(自网格)
self.canvas=canvas(根,宽度=900,高度=900)
self.canvas.pack()
self.a,self.b=45175
def无反应(自身、事件):
打印(“点击”)
打印(self.a)
自我评价a+=50
自我评价b+=50
self.canvas.create_image(self.a,self.b,image=self.pl,tags=“p2Tag”)
self.canvas.delete(“p1Tag”)
self.canvas.tag_bind(“p2Tag”,“”,self.noreaction)
def运行(自):
self.pl=PhotoImage(file=“player.png”)
self.canvas.create_image(self.a,self.b,image=self.pl,tags=“p1Tag”)
self.canvas.tag_bind(“p1Tag”,“”,self.noreaction)
self.x0,self.y0,self.x1,self.y1=-30150,20200
对于self.grid中的self.row:
对于self.row中的self.column:
self.x0+=50
self.x1+=50
self.cell=self.canvas.create_矩形(self.x0、self.y0、self.x1、self.y1)
自升式y0+=50
自升1+=50
self.x0=-30
self.x1=20
root=Tk()
root.focus_set()
obj=MainGame()
obj.run()
root.mainloop()
”不是用于绑定事件的有效键符号。请尝试一个有效的,你可以在这里查看完整的列表


编辑:看来我错了,不知道这是一个有效的事件。你每天都会学到一些东西:)

在把代码弄乱一点之后,
tag\u bind
只能通过鼠标点击来工作。在查看了我在
tag_bind
中找到的所有文档之后,没有任何内容表明可以将键绑定到绘制的对象。因此,这里的解决方案是将根窗口绑定到键,或者绑定画布所在的框架

我已经对您的代码做了一些修改,使其能够正常工作,但它应该可以帮助您朝着正确的方向前进。如果没有更多关于你在长期努力完成什么的信息,很难给出一个好的答案,但我认为这会有所帮助。如果你还有任何问题,请告诉我

from tkinter import *

class MainGame:
    def __init__(self, parent):
        self.parent = parent
        self.grid = [[""]*15 for n in range(15)]
        self.grid[14][3] = 1
        self.canvas = Canvas(self.parent, width = 900, height = 900)
        self.canvas.pack()        
        self.a, self.b = 45, 175

    #added an argument here so we can better control the player object.
    def noreaction(self, old):
        print("It clicked")
        print(self.a)
        self.a += 50
        self.b += 50
        self.canvas.delete(old)
        # assigned the object to a class attribute
        self.player_obj = self.canvas.create_image(self.a, self.b, image = self.pl, tags = "p2Tag")
        # you will see <Key-q> and <q> work the same here.
        self.parent.bind("<Key-q>", lambda x: self.noreaction(self.player_obj))

    def run(self):
        self.pl = PhotoImage(file = "./Colors/blk.gif")
        # assigned the object to a class attribute
        self.player_obj = self.canvas.create_image(self.a, self.b, image = self.pl, tags = "p1Tag")
        # you will see <Key-q> and <q> work the same here.
        self.parent.bind("<q>", lambda x: self.noreaction(self.player_obj))


        self.x0, self.y0, self.x1, self.y1 = -30, 150, 20, 200
        for self.row in self.grid:
            for self.column in self.row:
                self.x0 += 50
                self.x1 += 50

                self.cell = self.canvas.create_rectangle(self.x0, self.y0, self.x1, self.y1)
            self.y0 += 50
            self.y1 += 50
            self.x0 = -30
            self.x1 + 20

root = Tk()
root.focus_set()
obj = MainGame(root)

obj.run()

root.mainloop()
从tkinter导入*
主要游戏类别:
定义初始化(自身,父级):
self.parent=parent
self.grid=[[“”]*15表示范围内的n(15)]
自网格[14][3]=1
self.canvas=canvas(self.parent,宽度=900,高度=900)
self.canvas.pack()
self.a,self.b=45175
#在这里添加了一个参数,以便更好地控制播放器对象。
def无反应(自身、旧):
打印(“点击”)
打印(self.a)
自我评价a+=50
自我评价b+=50
self.canvas.delete(旧)
#将对象指定给类属性
self.player\u obj=self.canvas.create\u image(self.a,self.b,image=self.pl,tags=“p2Tag”)
#在这里,您将看到并使用相同的方法。
self.parent.bind(“,lambda x:self.noreaction(self.player\u obj))
def运行(自):
self.pl=PhotoImage(文件=“./Colors/blk.gif”)
#将对象指定给类属性
self.player\u obj=self.canvas.create\u image(self.a,self.b,image=self.pl,tags=“p1Tag”)
#在这里,您将看到并使用相同的方法。
self.parent.bind(“,lambda x:self.noreaction(self.player\u obj))
self.x0,self.y0,self.x1,self.y1=-30150,20200
对于self.grid中的self.row:
对于self.row中的self.column:
self.x0+=50
self.x1+=50
self.cell=self.canvas.create_矩形(self.x0、self.y0、self.x1、self.y1)
自升式y0+=50
自升1+=50
self.x0=-30
self.x1+20
root=Tk()
root.focus_set()
obj=主游戏(根)
obj.run()
root.mainloop()

请以文本而不是图像的形式发布代码。不希望重新键入所有代码。可能是添加绑定的组件没有焦点。尝试在根级别使用
bind\u all
。请不要在其他网站上发布指向代码的链接。花点时间在问题本身上贴一个答案。如果你不愿意花时间写一个好的问题,大多数人也不会愿意花时间写一个好的答案。我想测试代码,所以我自己把它打印出来。我已经将代码添加到OPs问题中,以便其他人可以使用它,如果他们愿意的话。嗨,对不起,我刚刚意识到将代码作为文本发布会更有帮助。从现在起我一定要这样做。不对。如果您
bind(“,some_func)
按下任何键都可以工作。如果执行
操作,它将仅适用于字母g小写。
不是有效的keysym,但它是有效的事件
的同义词规范文档在这里:您的回答意味着
无效,不会做任何事情。你的陈述需要更准确。我认为
tag\u bind
适用于文本项目。只是其他项目没有任何方法获得键盘焦点。@BryanOakley:我试图找到一种方法来聚焦绘制的对象,但在尝试了一些事情并查看了文档之后,我认为也没有方法聚焦绘制的对象。但是,绑定鼠标单击时会发生什么?这很好,但是鼠标点击在某种程度上提供了对对象的焦点吗?鼠标点击与焦点完全无关(除了绑定可能会改变焦点的事实)。@BryanOakley那么当我将鼠标点击绑定到对象时,是什么告诉tkinter鼠标在该对象上?为了使绑定工作,焦点需要在绑定设置的对象上。那是怎么回事