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
答案 0 :(得分: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
答案 1 :(得分: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
显然你预计这些比较都不是真的。但是,在比较元组时,元素中最左边的差异决定了结果。在您的代码中,满足的额外比较会导致激活额外的按钮。