0

pygame 应用程序有两排按钮。可以通过单击按钮来打开或关闭这些按钮。

问题在于,无论鼠标垂直位于何处,它都会同时单击该列的所有按钮,而不仅仅是一个;(就像一次单击整个 y 轴一样)。我在每次单击时打印了鼠标事件的 x 和 y 坐标,但坐标正常地在一个按钮的位置内。那么,为什么要打开或关闭多个按钮而不是一个按钮呢?我什至在任何按钮的垂直范围下方单击,只要 x 坐标仍在范围内,它们仍然被激活。无论如何,这是代码的一部分(对糟糕的编号系统感到抱歉):

    if event.type == pygame.MOUSEBUTTONUP:
        if event.pos < (130,130) and event.pos > (100,100):
            if seq01[0] == 0:
                seq01[0] = 1
                block_00 = block_on
            else:
                seq01[0] = 0
                block_00 = block_off
            print event.pos

        if event.pos < (170,130) and event.pos > (140,100):
            if seq01[1] == 0:
                seq01[1] = 1
                block_01 = block_on
            else:
                seq01[1] = 0
                block_01 = block_off

        #### this is the start of the second row ####
        if event.pos < (130,200) and event.pos > (100,170):
            if seq02[0] == 0:
                seq02[0] = 1
                block_2_00 = block_on
            else:
                seq02[0] = 0
                block_2_00 = block_off
4

2 回答 2

2

问题是您正在将鼠标位置(一对整数)与按钮角(另一对整数)进行比较。Python 按元素比较序列,因此您的测试实际上只检查第一个轴 (X)。

我强烈建议为每个按钮创建一个 pygame.Rect,然后您可以更简单地测试按钮是否在该区域内。

然后你的代码看起来更像这样,

if event.type == pygame.MOUSEBUTTONUP:
    if rect_00.collidepoint(event.pos):
        if seq01[0] == 0:
            seq01[0] = 1
            block_00 = block_on
        else:
            seq01[0] = 0
            block_00 = block_off
        print event.pos

    if rect_01.collidepoint(event.pos):
        if seq01[1] == 0:
            seq01[1] = 1
            block_01 = block_on
        else:
            seq01[1] = 0
            block_01 = block_off

    #### this is the start of the second row ####
    if rect_2_00.collidepoint(event.pos):
        if seq02[0] == 0:
            seq02[0] = 1
            block_2_00 = block_on
        else:
            seq02[0] = 0
            block_2_00 = block_off
于 2012-12-05T20:39:01.960 回答
0

你的比较是有缺陷的。考虑以下成绩单:

In [278]: pos=(120, 0)
In [279]: pos > (100,100)
Out[279]: True
In [280]: pos < (130,130)
Out[280]: True
In [281]: pos < (130,200)
Out[281]: True
In [282]: (100,170)
Out[282]: (100, 170)
In [283]: (129,300) < (130,130)
Out[283]: True
In [284]: (130,300) < (130,130)
Out[284]: False

显然,您预计这些比较都不是真的。然而,在比较元组时,决定结果的是元素中最左边的差异。在您的代码中,满足的额外比较会导致激活额外的按钮。

于 2012-12-05T20:40:33.893 回答