我正在使用安装了最新raspian jessie的rasperry pi。
我想对keydown事件做出反应,然后应该调用一个函数并执行一次,并且应该增加一个参数。
我目前拥有的是
# Import Libraries
from gpiozero import LED,Button
from signal import pause
from time import sleep
# LED Declaration
LED1 = LED(21)
LED2 = LED(16)
LED3 = LED(20)
# Button declaration
button = Button(19)
LED1.off()
LED2.off()
LED3.off()
current = 0
# Function for setting Outputs
def output(current):
print(current)
if current == 0:
LED1.off()
LED2.off()
LED3.off()
if current == 1:
LED1.on()
LED2.off()
LED3.off()
if current == 2:
LED1.off()
LED2.on()
LED3.off()
if current == 3:
LED1.on()
LED2.on()
LED3.off()
if current == 4:
LED1.off()
LED2.off()
LED3.on()
if current == 5:
LED1.on()
LED2.off()
LED3.on()
if current == 6:
LED1.off()
LED2.on()
LED3.on()
if current == 7:
LED1.on()
LED2.on()
LED3.on()
def increment(current):
print(current)
if current < 7:
current += 1
output(current)
return
if current == 7:
current = 0
output(current)
return
# Check for pressed button
while True:
if button.when_pressed True:
increment(current)
我怎样才能确保我的函数只被调用一次并且我的当前变量正确递增并且在触发一次函数时不会被重置为0?
答案 0 :(得分:1)
你while循环将阻止GUI工作。因此,请尝试使用按钮的命令选项来调用函数。此外,最佳做法是使用类来创建GUI。它有助于避免使用全局变量等。
matcher.group()
答案 1 :(得分:1)
此时,您尝试使用from tkinter import *
class Counter:
def __init__(self, master):
self.current = 0
# Button declaration
button = Button(master, text='+', command=self.increment)
button.grid()
def increment(self):
self.current += 1
print(self.current)
root = Tk()
app = Counter(root)
root.mainloop()
来跟踪增量器的状态。但current
中的current
与全局(模块)命名空间中的increment
不同。避免这种情况的最简单方法是在增量函数中将current
声明为current
,但我认为最好创建一个类以保持此状态
global
我使用bitwise class MyLeds()
def __init__(self, *leds, current=0):
self._leds = leds
self._current = current
def increment():
self._current = (self._current + 1) % (2 ** len(self._leds) - 1)
self._output()
def _output():
for i, led in enumerate(leds):
on = self._current & 2**i
led.on() if on else led.off()
# print('led %i is %s' % (i+1, on))
使代码更灵活,更适合更多的用户。
您的脚本的其余部分将如下所示:
&