2017-08-30 7 views
-1

Je veux faire bouger un sprite sur la toile et essayé d'utiliser les raccourcis clavier comme contrôles. Quand je cours le programme il ne bouge pas jusqu'à ce que j'essaye la clé correcte. J'ai testé avec les boutons de la souris et ça fonctionne bien.Comment réparer les raccourcis clavier dans tkinter

ajouter du code:

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

Veuillez poster votre code au lieu d'une image. Je ne veux pas retaper tout ce code. –

+0

Le composant auquel vous avez ajouté la liaison n'a probablement pas de focus. Essayez d'utiliser 'bind_all' au niveau racine. –

+1

S'il vous plaît ne pas poster un lien pour le code sur un autre site. Prenez le temps de poster un [mcve] dans la question elle-même. Si vous n'êtes pas prêt à prendre le temps d'écrire une bonne question, la plupart des gens ne voudront pas prendre le temps d'écrire une bonne réponse. –

Répondre

0

Après avoir joué un peu avec votre code, il semblerait que tag_bind ne fonctionne qu'avec des clics de souris. Après avoir examiné toute la documentation que j'ai pu trouver dans tag_bind il n'y a rien qui dit que vous pouvez lier une clé à un objet dessiné. Donc, la solution ici serait de lier soit la fenêtre racine à la clé ou de lier le cadre dans lequel le canevas est placé.

J'ai légèrement modifié votre code pour que cela fonctionne, mais cela devrait vous aider à bonne direction. Sans plus d'informations sur ce que vous essayez d'accomplir à long terme, il est difficile de fournir une bonne réponse, mais je pense que cela aidera. Faîtes moi savoir si vous avez d'autres questions.

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

Je pense que 'tag_bind' fonctionne pour les éléments de texte. C'est juste que les autres éléments n'ont aucun moyen d'obtenir le focus du clavier. –

+0

@BrianOakley: J'essayais de trouver un moyen de focaliser l'objet dessiné mais après avoir essayé quelques choses et avoir regardé les docs, je ne pense pas qu'il y ait un moyen de focaliser un objet dessiné non plus. Cependant, que se passe-t-il lorsque vous liez un clic de souris? Cela fonctionne bien mais est le clic de la souris en mettant l'accent sur l'objet en quelque sorte? –

+0

Les clics de la souris n'ont aucun rapport avec le focus (à l'exception du fait que les liaisons peuvent modifier le focus). –

-2

"<Key>" est pas un keysym valide pour lier un événement. Essayez valide, pour une liste complète, vous pouvez regarder ici http://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm

edit: semble que je me suis trompé, ne savait pas que ce fut un événement valide. Vous apprenez quelque chose tous les jours :)

+1

Incorrect. Si vous liez ("", some_func) 'cela fonctionnera si vous appuyez sur n'importe quelle touche. et si vous faites '" "' il ne fonctionnera que pour la lettre g en minuscule. –

+1

'' n'est pas un _keysym_ valide, mais c'est un événement valide. '' est un synonyme de '' La documentation canonique est ici: http://tcl.tk/man/tcl8.5/TkCmd/bind.htm –

+0

votre réponse implique que '' est invalide et ne fera rien. Vous devez être plus précis avec vos déclarations. –