在 Canvas 小部件上绑定按键事件
Binding a key press event on a Canvas widget
我已经通过以下方式将密钥绑定到我的 canvas:
self.canvas.bind("<w>", lambda event: self.canvas.focus_set())
现在,我该怎么做才能在按下该键时调用特定操作,例如在 canvas 上向上移动一个对象?
根据文档,您需要以下内容:
- 如果您还没有这样做,请在 self.canvas.bind() 的第一个参数中指定要绑定为模式的键。
- 第二个参数可以是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()
我已经通过以下方式将密钥绑定到我的 canvas:
self.canvas.bind("<w>", lambda event: self.canvas.focus_set())
现在,我该怎么做才能在按下该键时调用特定操作,例如在 canvas 上向上移动一个对象?
根据文档,您需要以下内容:
- 如果您还没有这样做,请在 self.canvas.bind() 的第一个参数中指定要绑定为模式的键。
- 第二个参数可以是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()