2012-12-05 28 views
0

pygame应用程序有两排按钮。按钮可以通过点击打开或关闭。Mouse.event发生在任何y pos位置,无论实际y pos

问题是无论鼠标在哪个垂直位置,它都会同时点击该列中的所有按钮,而不仅仅是一个; (就好像整个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 

回答

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 
+0

好的,这样做更有意义。我会试一试。谢谢。 –

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 

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