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

Binding a key press event on a Canvas widget

我已经通过以下方式将密钥绑定到我的 canvas:

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

现在,我该怎么做才能在按下该键时调用特定操作,例如在 canvas 上向上移动一个对象?

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

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

示例:

# 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.

更多信息:

您可以在每次单击字母 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()