响应用户交互和系统事件
bind() 基础
widget.bind(sequence, callback, add=None) → funcid
bind_basics.py
label.bind("<Button-1>", lambda e: print(f"点击位置:{e.x},{e.y}"))
root.bind("<Control-s>", lambda e: save())
root.bind("<Escape>", lambda e: root.destroy())
事件对象
| 属性 |
类型 |
说明 |
widget |
Widget |
接收事件的控件 |
x, y |
int |
鼠标相对于控件的位置 |
x_root, y_root |
int |
鼠标相对于屏幕的位置 |
num |
int |
鼠标按钮编号(1、2、3) |
keysym |
str |
键名(例如 "Return"、"a"、"F5") |
char |
str |
输入的字符(可能为空) |
state |
int |
修饰键位掩码(Shift、Ctrl、Alt) |
delta |
int |
滚动量(鼠标滚轮事件) |
width, height |
int |
新尺寸(配置事件) |
鼠标事件
| 序列 |
触发时机 |
<Button-1> |
鼠标左键按下 |
<Button-3> |
鼠标右键按下 |
<ButtonRelease-1> |
鼠标左键释放 |
<Double-Button-1> |
鼠标左键双击 |
<B1-Motion> |
按住左键时移动鼠标 |
<Motion> |
鼠标移动(任意按键或无按键) |
<Enter> / <Leave> |
鼠标光标进入/离开控件 |
<MouseWheel> |
鼠标滚轮滚动(event.delta) |
键盘事件
| 序列 |
说明 |
<Key> |
任意按键按下 |
<Return> |
回车键 |
<Escape> |
ESC 键 |
<Tab> / <BackSpace> / <Delete> |
Tab / 退格 / Delete |
<Up> <Down> <Left> <Right> |
方向键 |
<F1> … <F12> |
功能键 |
<Control-s> |
Ctrl+S |
<Control-Shift-Z> |
Ctrl+Shift+Z |
虚拟事件
| 虚拟事件 |
触发时机 |
<<Cut>> <<Copy>> <<Paste>> |
剪贴板操作 |
<<ComboboxSelected>> |
ttk.Combobox 选择变更 |
<<NotebookTabChanged>> |
ttk.Notebook 标签页切换 |
<<TreeviewSelect>> |
ttk.Treeview 行被选中 |
<<ListboxSelect>> |
Listbox 选择变更 |
after() —— 定时器
widget.after(ms, func=None, *args) → after_id
countdown.py
count = tk.IntVar(value=10)
label = ttk.Label(root, textvariable=count, font=("TkDefaultFont", 48))
label.pack(padx=40, pady=20)
def tick():
n = count.get()
if n > 0:
count.set(n - 1)
root.after(1000, tick)
else:
label.config(text="完成!")
root.after(1000, tick)