tkinter - canvas - keine Reaktion auf Tastatur events ...

Fragen zu Tkinter.
Antworten
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo,

leider funktioniert es bei mir nicht, dass mein Canvas Objekt auf Tastatur Events reagiert,
es reagiert nur auf Mouse Events,

hier im Code binde ich z.B. Button-1 (mouse) und Return (keyboard) ein, aber leider
funktioniert nur die Maus,

was kann ich da tun?

Habe auch schon probiert mit xxx.bind("<KeyPress>", callback) zu arbeiten, aber auch
hier reagiert nix auf mein Keyboard ...

Hat jemand einen Tipp fuer mich?

Thanx
lp


Code: Alles auswählen

#!/usr/bin/env python

import Tkinter as tk

class MyApplication(object):
    
   def __init__(self, master):
      self.canvas = tk.Canvas(width=800, height=800, bg="#FFFFFF")
      self.photo  = tk.PhotoImage(file="test.gif")
      self.yoda = self.canvas.create_image(self.photo.width()/2.0,  \
                                           self.photo.height()/2.0, \
                                           image  = self.photo,     \
                                           anchor = tk.NW,          \
                                           tags   = "my_yoda"       )  
      self.canvas.coords(self.yoda, 50, 50)
      self.canvas.bind('<ButtonPress-1>', self.move_image)
      self.canvas.bind('<Return>',        self.move_image)
      self.canvas.pack()   
   
   def move_image(self, *args):
      print "moving now ..."
      self.canvas.move("my_yoda", 5,5)

if __name__ == "__main__":
   root = tk.Tk()
   display = MyApplication(root)
   root.mainloop()

Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo ts7343

Der Focus muss auf die Canvas gesetzt werden:

Code: Alles auswählen

      self.canvas.coords(self.yoda, 50, 50)
      self.canvas.bind('<ButtonPress-1>', self.move_image)
      self.canvas.bind('<Return>',        self.move_image)
      self.canvas.pack()
      # Ergänzen mit der Methode 'self.canvas.focus_set()'
      self.canvas.focus_set() # Setzt den Focus auf die Canvas
Gruß wuf :wink:
Take it easy Mates!
problembär

Alternativ kannst Du auch ".bind()" auf das root-Window anwenden.
Benutzeravatar
ts7343
User
Beiträge: 69
Registriert: Mittwoch 5. Mai 2010, 13:48

Hallo,

@wuf:
vielen Dank fuer die Hiilfe, "focus_set" funktioniert, das kannte ich noch gar nicht!

@problembär:
in dem Thread "Canvas begrenzen" hab ich das mit dem .bind() auf das root Window
auch gesehen und mit den Code geladen und auch gesehen, dass dort die Tastatur
reagiert hat, aber der Code dort ist auch etwas anders aufgesetzt.
Wie muesste das in meinem Code aussehen, das ueber root in der main function einzubinden,
und wuerde das nicht irgendwann unsauber aussehen (also bei groesserer Anzahl von Assignments)?


many thanx from ts7343
Antworten