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鼠标在该对象上?为了使绑定工作,焦点需要在绑定设置的对象上。那是怎么回事