在Canvas小部件上绑定按键事件

时间:2015-02-05 15:17:59

标签: python tkinter tkinter-canvas

'通过以下方式将密钥绑定到我的画布上:

self.canvas.bind("<w>", lambda event: self.canvas.focus_set())

现在,当按下该键时我该怎么做,它会调用一个特定的动作,比如在画布上移动一个对象?

2 个答案:

答案 0 :(得分:1)

根据文档,您需要以下内容:

  1. 如果您还没有这样做,请在self.canvas.bind()的第一个参数中指定要绑定为模式的键。
  2. 第二个参数可以是lambda表达式,函数或类方法。
  3. 示例:

    # Sample event handler
    def handle_up_key(self, event):
        self.canvas.focus_set()
        # Do whatever else you want.
    
    def __init__(self):
        self.canvas.bind("<Key-Up>", self.handle_up_key)
        self.canvas.bind("<KeyPress-Up>", ...)
        self.canvas.bind("<KeyRelease-Up>", ...)
        # And so for any key you want to map.
    

    更多信息:

答案 1 :(得分:1)

只要点击例如字母W,就可以指定新的坐标

Here您可以找到canvas对象支持的方法。有一个叫coords,它允许您通过ID指定对象的坐标。 ID是创建对象时返回的值,例如,当您创建oval

oval_id = canvas.create_oval(x1, y1, x2, y2)

ID是唯一的,因此您可以使用它们专门移动一个对象。 例如,您可以bind_all使用某个方法点击某个字母(例如w),这会移动我们的椭圆形。以下是一个完整的工作示例(我讨厌使用global,但在这种情况下,我使用它是为了简单):

try:
    import tkinter as tk  # using Python 3
except ImportError:
    import Tkinter as tk  # using Python 2

def move(event=None):
    global x1, x2, y1, y2, oval
    if event.char == 'w':
        y1 -= 10
        y2 -= 10
        oval = (x1, y1, x2, y2)
        canvas.coords(oval_id, oval)

m = tk.Tk()

canvas = tk.Canvas(m)
canvas.pack(expand=1, fill='both')
x1, x2 = 50, 100
y1, y2 = 50, 100
oval = (x1, y1, x2, y2)
oval_id = canvas.create_oval(oval)
canvas.bind_all('<w>', move)  

m.mainloop()