使用 tkinter

时间:2021-08-01 19:04:27

标签: python tkinter mouseevent

我想编写一个简单的程序来使用 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 秒内左键单击,它运行良好,没有任何问题。

请告诉我为什么会出现此问题以及如何解决。

0 个答案:

没有答案