2012-12-05 30 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 

顯然你預期這些比較都不是真的。然而,在比較元組時,它是確定結果的元素中最左邊的差異。在您的代碼中,滿足的額外比較會導致額外的按鈕被激活。