我想编写一个简单的程序来使用 tkinter 检测同时单击鼠标左键和右键。我参考了问题 Detect simultaneous left and right clicks in tkinter gui 并进行了一些更改,但遇到了一些问题。代码如下:
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()
对两次点击的检测有时有效但有时无效,因此我将 root.after()
函数的第一个参数设为 1000 微秒(如代码所示)。
据我了解,如果我运行上面的代码,在1秒内先左键再右击,函数运行顺序应该是:
call_back_left --> call_back_right --> 等待大约 1 秒 --> left_judge_right --> right_judge_left
打印结果应该是:
“第 X 行和 Y 列上的按钮都点击”
然而,结果是:
“第X行按钮,Y列左键单击”
“第X行按钮,第Y列右击”
函数运行顺序好像是:
call_back_left --> left_judge_right --> 等待大约 1 秒 --> call_back_right --> right_judge_left
然后我尝试先右键单击,然后在 1 秒内左键单击,它运行良好,没有任何问题。
请告诉我为什么会出现此问题以及如何解决。