tkinter实现鼠标左右键同时点击检测时先左后右识别失效如何修复
问题原因
- 核心错误出在
call_back_left函数中root.after()的调用语法:
你写的root.after(1000, left_judge_right(v, h))会立即执行left_judge_right(v, h),而非等待1秒后执行。因为给函数名加了括号后,Python会先调用该函数获取返回值,再将返回值传给after方法,完全没有起到延迟调度的作用。 - 而
call_back_right中的after写法是正确的:root.after(1000, right_judge_left, v, h),这里没有给函数加括号,是把函数本身作为可调用对象传给after,后续的v、h是延迟调用时传入的参数,所以先点右键再点左键的逻辑可以正常运行。
修复方案
仅需要修改call_back_left里的after调用写法,和右键回调的写法保持一致即可:
# 原错误写法 # root.after(1000, left_judge_right(v, h)) # 修改后的正确写法 root.after(1000, left_judge_right, v, h)
修改后完整可运行代码如下:
from tkinter import * def call_back_left(event, v, h): global left, right if right: right = False else: left = True root.after(1000, left_judge_right, v, h) def left_judge_right(v, h): global left, right if left: print(f'Button on row{v}, column{h}\t\tleft click') left = False else: print(f'Button on row{v}, column{h}\t\tboth clicks') def call_back_right(event, v, h): global left, right if left: left = False else: right = True root.after(1000, right_judge_left, v, h) def right_judge_left(v, h): global left, right if right: print(f'Button on row{v}, column{h}\t\tright click') right = False else: pass left = False right = False root = Tk() vertical, horizontal = 4, 4 map_area = Frame(root, pady=10) map_area.pack(side=TOP) for v in range(vertical): for h in range(horizontal): button = Button(map_area, text=' ', width=5, height=2) button.grid(row=v, column=h) button.bind("<Button-1>", lambda event, i=v, j=h: call_back_left(event, i, j)) button.bind("<Button-3>", lambda event, i=v, j=h: call_back_right(event, i, j)) root.mainloop()
优化提示:目前1秒的判定窗口太长,实际使用可以把
after的第一个参数改成200300,也就是200300毫秒内的点击算同时点击,更符合正常操作习惯。
内容的提问来源于stack exchange,提问作者zhmff
相关产品推荐
相关产品推荐

