2017-03-11 63 views
0

我試圖編程一個樹莓派上的按鈕來添加一個整數到另一個整數,以便我可以在while循環中通過檢查變量mod 2是否爲0來在條件之間來回翻轉。我基本上試圖通過檢查變量是奇數還是偶數來改變while循環中的條件。如何使用gpiozero button.when_pressed函數來使用輸入和輸出整數的函數?

我試圖使用gpiozero庫的when_pressed函數,但似乎無法調用添加和輸出整數的函數。

所以,我的代碼是:

from gpiozero import Button 
btn = Button(17) #the button is wired to GPIO pin 17 

def addSurf(a): 
    a = a + 1 
    return(a) 

x = 0 
btn.when_pressed = addSurf(x) 

while True: 
    if x == 0: 
     #do some stuff 
    else: 
     #do some other stuff 

爲什麼我嘗試運行此,我得到TypeError: unsupported operand type(s) for +: 'Button' and 'int'

我如何使用btn.when_pressed功能使用功能輸入和輸出的整數?

可替代地,有一些其他[更好?]的方法使一個按鈕切換兩種狀態的while循環?

回答

0

我意識到button.when_pressed函數不能帶任何參數。

爲了實現我原來有一個while循環兩種不同狀態之間的鍵切換的目標,我最後不得不按鈕切換一個整數的符號作爲全局變量在自己的線程在while循環,並具有全局變量的符號切換原始while循環中另一個線程中的條件。這不是一個真正的做法,但我得到了它的工作。

1

是可能的參數傳遞到gpiozero按鈕「when_pressed」屬性,但它沒有很好的記錄。我找不到任何例子。 (提示呼救gpiozero創作者!)

我所做的是傳遞一個lambda函數到「when_pressed」它包含了我希望函數訪問的變量。

這裏是我的版本的程序:

from gpiozero import Button 
from signal import pause 

btn = Button(17) #the button is wired to GPIO pin 17 

class X(): 
    value = 0 


def addSurf(x): 
    x.value += 1 
    print('Adding 1') 

def do_something_when_button_is_released(x): 
    print('x = ',x.value) 


x = X() 
btn.when_pressed = lambda : addSurf(x) 
btn.when_released = lambda : do_something_when_button_is_released(x) 
pause() 

我用一個類作爲您的原始變量「x」的容器。這可能是矯枉過正,但我​​試圖用x作爲整數來做同樣的事情,但它不起作用!不明白爲什麼。無論如何,一個類允許你添加多個變量。

的另一點是,「而真正的」循環不會用這種方法工作,因爲它會佔用所有的CPU時間。最好使用我稱之爲「do_something_when_button_is_released」的函數來觸發其他事情。

相關問題