我希望有人能幫助我解決這個問題。我希望修復起來相當簡單,但我已經嘗試了一段時間來解決這個問題。我已將較大的代碼修剪為這個,因為我相信這里的問題是問題的癥結所在。
我有一個樹莓派和一個外部按鈕。這是在 Linux 上的 python3 上。我正在為按鈕使用 GPIOZero。我相信下面的代碼很容易理解,但基本上,我想要一個始終回圈的函式。當我按下按鈕時,我希望運行另一個函式,但前提是變數是某個數字。我在下面的評論中描述了我最終想要發生的事情,但我的代碼未完成且僅針對此問題進行了簡化。
我只想button.when_pressed在timer = 0. 問題是,一旦代碼自然地進入button.when_pressed函式,它就再也不會“放手”這個函式了。當我成功地將變數重新定義為 時timer = 1,當我按下按鈕時它仍然列印按鈕被按下。我不知道為什么。對我來說,它似乎應該只作業一次timer = 0。
有什么建議?我想我對我將計劃研究的全域變數有誤解。我不確定是否是這個問題。我也試過使用break并continue試圖讓它“回到它的回圈”,但這也沒有奏效。我也想使用button.when_pressed而不是btn.is_pressed,因為我希望程式只在我按住按鈕一次時做一些事情,而不是在我按住它時回圈。在這種情況下,我希望按下按鈕列印一次。如果我這樣做了,btn.is_pressed它會每兩秒鐘按下一次列印按鈕,這是我不想要的。
謝謝你的幫助。我很高興學習。
#!/usr/bin/python3
from gpiozero import Button
from time import sleep
import time
button = Button(4)
timer = 0
def press():
print("Button is pressed")
global timer
timer = 1
def loop():
global timer
timer = 1
while True:
if timer == 0:
button.when_pressed = press
else:
loop()
sleep(2)
uj5u.com熱心網友回復:
如果要禁用已設定為 的回呼button.when_pressed,則需要使用button.when_pressed = None. 這在檔案中列出:
發布時間:
[...] 將此屬性設定為
None(默認值)以禁用該事件。
目前尚不清楚您希望從當前代碼中獲得什么行為。如果您希望按鈕激活 2 秒,然后無限期停用,您可以使用:
button.when_pressed = press
sleep(2)
button.when_pressed = None
不需要回圈,因為您不想重復任何內容。
如果您只希望按鈕在按一次按鈕時處于活動狀態,這需要在 2 秒內發生,您可以改為呼叫button.wait_for_press(2). 我猶豫要為此撰寫完整的代碼塊,因為檔案沒有指定超時是如何發出信號的(可能是通過回傳值,也可能是通過例外)。我沒有 Raspberry Pi,所以我無法測驗自己,但您可以嘗試一下,看看會發生什么。
uj5u.com熱心網友回復:
把你的整段代碼當作一個“黑匣子”,問問自己,輸入/輸出是什么?button press或者timer mode?(因為我不太明白timer你的代碼中變數是什么意思)
您的代碼暗示timer mode是控制流程的頂級輸入,
while True:
if timer == 0:
button.when_pressed = press
else:
loop()
sleep(2)
是預期的嗎?
如果您允許用戶隨時按下按鈕,建議您將button press其設定為頂級輸入,更改邏輯以when_pressed始終保持回呼,一旦觸發就設定標志,然后檢查按鈕是否已經pressed并仍在is_pressed您的while回圈中.
pressed = False
def play_video_1():
pass
def play_video_2():
pass
def press():
print("Button is pressed")
global pressed
pressed = True
button.when_pressed = press
while True:
if pressed and not_playing_video2:
if is_pressed:
play_video_1()
else:
pressed = False
play_video_2()
else:
play_video_2()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/388185.html
