5

我在 python 中编写了这个简单的测试程序,以检查当我按下 Raspberry Pi 中的按钮时是否发生了什么事情:

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_UP)

testVar=0

def my_callback(channel):
  print "Pressed!"
  testVar= 32

GPIO.add_event_detect(24, GPIO.FALLING, callback=my_callback, bouncetime=200)
while True:
    print str(testVar)
    sleep(0.5)

我只读取 0 个值,当我按下按钮时,我看到“按下!” 但变量没有改变。据我了解,原因是因为回调函数是作为新线程午餐的,当然变量无法正确设置。有没有办法以某种方式将共享 var 发送到回调函数?

非常感谢任何好的建议。

4

2 回答 2

5

嗨,找到解决方案,我正在发布它,也许它可能有用。使用全局这个词使它起作用。

所以回调函数变成:

def my_callback(channel):
    global testVar
    print "Pressed!"
    testVar= 32
于 2015-04-23T14:06:35.433 回答
1

我有同样的问题让我发疯......将变量设置global为解决方案。解释是根据this tutorial on global variables,只要变量没有标记为全局变量,它就会保持在函数的本地范围内。在函数内部使变量成为全局变量有两个后果:

a) 如果全局变量 x 不存在:global x = 0创建一个新的全局变量x并将其值设置为 0

b) 如果全局变量 x 已经存在:global x = 0将现有全局变量的值更改为 0(与没有 global 关键字相反x = 0,它将值 0 分配给局部范围的变量)。

所以b是在回调函数中改变全局变量值的解决方案。

于 2020-12-05T12:24:04.693 回答