Tkinter中Shift修饰键与鼠标滚轮绑定失效问题求助
Tkinter中Shift修饰键与鼠标滚轮绑定失效问题求助
各位好,我最近在Tkinter里遇到个奇怪的问题:明明能正常把Shift和鼠标左键绑定,也能把Control、Alt和鼠标滚轮绑定成功,但唯独Shift+鼠标滚轮的绑定死活不生效,想请教下大家我哪里写错了,或者是环境的问题?
我写了个测试代码来验证所有组合:
import tkinter as tk root = tk.Tk() label = tk.Label(root) label.grid(row=0, column=0, sticky='nsew') label.config(text='Mouse Wheel with Modifiers') def show_event(event, desc=''): label.config(text=desc + ' ' + str(event)) print(desc + ' ' + str(event)) label.bind('<Shift-Button-1>', lambda event, desc='Shift+Click': show_event(event, desc)) label.bind('<Control-Button-1>', lambda event, desc='Control+Click': show_event(event, desc)) label.bind('<Alt-Button-1>', lambda event, desc='Alt+Click': show_event(event, desc)) label.bind('<Button-1>', lambda event, desc='[]+Click': show_event(event, desc)) label.bind('<Shift-Button-4>', lambda event, desc='Shift+Wheel': show_event(event, desc)) label.bind('<Control-Button-4>', lambda event, desc='Control+Wheel': show_event(event, desc)) label.bind('<Alt-Button-4>', lambda event, desc='Alt+Wheel': show_event(event, desc)) label.bind('<Button-4>', lambda event, desc='[]+Wheel': show_event(event, desc)) root.mainloop()
我按照代码里的顺序依次操作后,输出结果是这样的:
Shift+Click <ButtonPress event state=Shift|Mod2|0x2000 num=1 x=107 y=9> Control+Click <ButtonPress event state=Control|Mod2|0x2000 num=1 x=107 y=9> Alt+Click <ButtonPress event state=Mod1|Mod2|0x2000 num=1 x=107 y=9> []+Click <ButtonPress event state=Mod2|0x2000 num=1 x=107 y=9> ### []+Wheel <ButtonPress event state=Mod2|0x2000 num=4 x=107 y=9> Control+Wheel <ButtonPress event state=Control|Mod2|0x2000 num=4 x=107 y=9> Alt+Wheel <ButtonPress event state=Mod1|Mod2|0x2000 num=4 x=107 y=9> []+Wheel <ButtonPress event state=Mod2|0x2000 num=4 x=107 y=9>
可以看到,我按住Shift滚动滚轮的时候,输出的是[]+Wheel(也就是无修饰键的滚轮事件),完全没触发我绑定的Shift+Wheel处理逻辑,这明显不对。
后续测试更新
我后来做了更多测试,发现情况有点复杂:
- 换了一台物理机(Ubuntu 24.04,Python 3.12,Tkinter 8.6)测试,
<Shift-Button-4>的绑定是正常生效的,能正确捕获Shift+滚轮的事件,说明代码本身应该是没问题的。 - 在有问题的机器上用
xev工具查看底层事件:普通滚轮、Control+滚轮都能正常识别成对应的Button事件,但Shift+滚轮居然被识别成了state 0x2011, button 7(我当时是反向滚动的,对应Button7),而不是预期的Shift+Button4/5。 - 补充下有问题的机器环境:是VirtualBox 7.0.6里的Ubuntu 20.04虚拟机,宿主机是MacOS 11.7.1。我怀疑是不是虚拟机在转译Mac上的
<Shift-MouseWheel>事件时出了乱子?毕竟之前也碰到过类似的、VirtualBox里Linux客户机和Mac宿主机之间滚动事件的老问题。 - 我尝试过直接绑定
<Button-6>和<Button-7>,但完全捕获不到事件;也试过用<MouseWheel>和<Shift-MouseWheel>的事件名来绑定,同样没效果。
有没有大佬碰到过类似的情况,或者知道怎么解决这个问题呀?
备注:内容来源于stack exchange,提问作者wtw
相关产品推荐
相关产品推荐

