“If,Then”语句注册backtoback鼠标点击

2024-10-03 09:15:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我的程序注册连续三次鼠标点击。每次单击鼠标时,都会绘制一个唯一的对象(预先确定的位置和形状)。第一次单击=第一个对象出现,如果再次单击=第二个对象出现,如果单击第三次=第三个对象出现。这应该是什么样子?你知道吗

这是我所拥有的,但不起作用:

def printer(event):
    x, y = event.x, event.y
    print(x,y)

    if event.x in range (130,224) and event.y in range(197,305):
        canvas.create_oval(146, 158, 140, 164, outline="indianred2", fill="red", width=1.5)

    elif event.x in range (130,224) and event.y in range(197,305):
        canvas.create_oval(180.5, 158, 174.5, 164, outline="indianred2", fill="red", width=1.5)

    elif event.x in range (130,224) and event.y in range(197,305):
        canvas.create_oval(209, 158, 215, 164, outline="indianred2", fill="red", width=1.5)

Tags: and对象ineventcreaterangered鼠标
2条回答

Tkinter支持开箱即用的双击和三次单击。例如:

canvas.bind("<1>", self.on_click)
canvas.bind("<Double-1>", self.on_double)
canvas.bind("<Triple-1>", self.on_triple)

如果您希望用户能够非常缓慢地单击,则必须自己计算单击次数。你知道吗

您必须维护一个变量来计算用户已单击的频率,然后根据该变量的当前值,在一个位置或另一个位置绘制图形。你知道吗

counter = 0

def printer(event):
    global counter
    x, y = event.x, event.y
    if event.x in range (130,224) and event.y in range(197,305):
        if counter == 0:
            canvas.create_oval(146, 158, 140, 164, outline="indianred2", fill="red", width=1.5)
        elif counter == 1:
            canvas.create_oval(180.5, 158, 174.5, 164, outline="indianred2", fill="red", width=1.5)
        elif counter == 2:
            canvas.create_oval(209, 158, 215, 164, outline="indianred2", fill="red", width=1.5)
        counter += 1

而且,代码中有相当多的重复。由于要在何处绘制的坐标似乎是唯一会发生变化的东西,因此可以使用字典(或简单数组)来存储要在何处绘制的图形。此外,使用range检查某个数字是否在某个范围内也是浪费,因为您不仅每次都创建一个新列表,而且还要检查该列表中的每个值。相反,只需使用<=<。你知道吗

coords = {0: (146, 158, 140, 164), 
          1: (180.5, 158, 174.5, 164), 
          2: (209, 158, 215, 164)}
counter = 0

def printer(event):
    global counter
    if 130 <= event.x < 224 and 197 <= event.y < 305:
        if counter in coords:
            a, b, c, d = coords[counter]
            canvas.create_oval(a, b, c, d, outline="indianred2", fill="red", width=1.5)
        counter += 1

相关问题 更多 >