2017-08-30 97 views
-1

我想让sprite在画布上四处移动,并尝试使用键绑定作为控件。当我运行该程序时,它不会移动,直到我尝试正确的密钥。我用鼠标按钮进行测试,它工作正常。如何修复tkinter中的键绑定

添加代码:

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() 
+3

请将您的代码发布为文本而不是图片。不想重新输入所有的代码。 –

+0

您添加绑定的组件可能没有焦点。尝试在根级别使用'bind_all'。 –

+1

请不要发布一个链接到另一个网站上的代码。花时间在问题本身发布[mcve]。如果你不愿花时间写出一个好问题,大多数人都不愿花时间写出一个好答案。 –

回答

0

经过一段时间搞乱你的代码后,它会缝合tag_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() 
+0

我认为'tag_bind'适用于文本项目。只是其他项目没有办法获得键盘焦点。 –

+0

@BryanOakley:我试图找到一种方法来集中绘制的对象,但尝试了几件事情后,看着文档,我不认为有一种方法来聚焦绘制的对象。然而当你绑定鼠标点击时发生了什么?这工作正常,但是鼠标点击以某种方式提供对象的焦点? –

+0

鼠标点击与焦点完全无关(除了绑定可能会改变焦点的事实)。 –

-2

<Key>” 不是一个事件上结合的有效键符。尝试一个有效的,对于一个完整的列表,你可以看看这里http://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm

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

+1

不正确。如果你绑定(“”,some_func)'它将工作,如果任何按键被按下。如果你这样做'“”'它只适用于字母g小写。 –

+1

''不是有效的_keysym_,但它是一个有效的事件。 ''是''的同义词'规范文档在这里:http://tcl.tk/man/tcl8.5/TkCmd/bind.htm –

+0

你的答案意味着''是无效的,不会做任何事情。你需要更准确的陈述。 –