我为Raspberry Pi的GPIO制作了一些硬件,我想测试一下。我找到了一些巧妙的python代码,为8个输出生成了8个按钮,并允许您切换它们的状态。我几乎不了解python,但我希望能够通过键盘切换8个输出(例如1-8号)。我不知道如何在不暂停程序流程的情况下请求键盘输入,然后在响应后继续。
如何使数字1-8“中断”我的程序并跳转到8个相应函数中的1个?
我的代码:
from Tkinter import *
import RPi.GPIO as GPIO
import time
GPIO.setmode( GPIO.BCM )
GPIO.setup( 4, GPIO.OUT)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(21, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
GPIO.setup(25, GPIO.OUT)
class App:
io4=0
io17=0
io18=0
io21=0
io22=0
io23=0
io24=0
io25=0
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.p1 = Button(frame, text="GPIO 25",fg="green", command=self.gpio25)
self.p1.pack(side=LEFT)
self.p1.grid(row=0,column=0)
self.p2 = Button(frame, text="GPIO 24",fg="red", command=self.gpio24)
self.p2.pack(side=LEFT)
self.p2.grid(row=0,column=1)
self.p3 = Button(frame, text="GPIO 23",fg="red", command=self.gpio23)
self.p3.pack(side=LEFT)
self.p3.grid(row=0,column=2)
self.p4 = Button(frame, text="GPIO 22",fg="red", command=self.gpio22)
self.p4.pack(side=LEFT)
self.p4.grid(row=0,column=3)
self.p5 = Button(frame, text="GPIO 21",fg="red", command=self.gpio21)
self.p5.pack(side=LEFT)
self.p5.grid(row=0,column=4)
self.p6 = Button(frame, text="GPIO 18",fg="red", command=self.gpio18)
self.p6.pack(side=LEFT)
self.p6.grid(row=0,column=5)
self.p7 = Button(frame, text="GPIO 17",fg="red", command=self.gpio17)
self.p7.pack(side=LEFT)
self.p7.grid(row=0,column=6)
self.p8 = Button(frame, text="GPIO 4", fg="red",command=self.gpio4)
self.p8.pack(side=LEFT)
self.p8.grid(row=0,column=7)
def gpio4(self):
if self.io4==0:
GPIO.output(4, GPIO.HIGH)
self.io4=1
else:
GPIO.output(4, GPIO.LOW)
self.io4=0
return
def gpio17(self):
if self.io17==0:
GPIO.output(17, GPIO.HIGH)
self.io17=1
else:
GPIO.output(17, GPIO.LOW)
self.io17=0
return
def gpio18(self):
if self.io18==0:
GPIO.output(18, GPIO.HIGH)
self.io18=1
else:
GPIO.output(18, GPIO.LOW)
self.io18=0
return
def gpio21(self):
if self.io21==0:
GPIO.output(21, GPIO.HIGH)
self.io21=1
else:
GPIO.output(21, GPIO.LOW)
self.io21=0
return
def gpio22(self):
if self.io22==0:
GPIO.output(22, GPIO.HIGH)
self.io22=1
else:
GPIO.output(22, GPIO.LOW)
self.io22=0
return
def gpio23(self):
if self.io23==0:
GPIO.output(23, GPIO.HIGH)
self.io23=1
else:
GPIO.output(23, GPIO.LOW)
self.io23=0
return
def gpio24(self):
if self.io24==0:
GPIO.output(24, GPIO.HIGH)
self.io24=1
else:
GPIO.output(24, GPIO.LOW)
self.io24=0
return
def gpio25(self):
if self.io25==0:
GPIO.output(25, GPIO.HIGH)
self.io25=1
else:
GPIO.output(25, GPIO.LOW)
self.io25=0
return
def reserved(self):
return
root = Tk()
app = App(root)
root.mainloop()
答案 0 :(得分:2)
将master.bind(...)
命令添加到__init__
方法:
def __init__(self, master):
frame = Frame(master)
frame.pack()
master.bind('1', self.gpio25)
master.bind('2', self.gpio24)
master.bind('3', self.gpio23)
...
master.bind('1', self.gpio25)
将keypress 1
事件绑定到方法调用self.gpio25(event)
。
您还需要7个master.bind
来电 - 每个密钥一个。
接下来,修改回调函数的定义。您需要为每个参数添加第二个参数event
。例如,改变
def gpio25(self):
到
def gpio25(self, event = None):
<强>解释强>
使用bind
方法时,您将Event
绑定到回调函数(例如self.gpio25
)。按键是KeyPress事件。有关该事件的信息将发送到Event对象中的回调。因此回调函数必须采用一个参数。
有关详细信息,请参阅Tkinter events and bindings。
Buttons
的工作方式不同。它们的回调函数使用零参数调用。
由于我们使用相同的回调函数self.gpio25
,作为Keypress事件回调和Button回调,它必须是一个可以接受零个或一个参数的函数。
在Python中,这样做的方法是使用如下的调用签名定义gpio25
:
def gpio25(self, event = None):
self
是类App
的一个实例。 self.gpio25
是绑定方法,self
绑定为其第一个参数。因此,调用self.gpio25()
会将gpio25
函数调用self
作为第一个参数(并且局部变量event
将被赋值None
)。调用self.gpio25(foo)
会将gpio25
作为第一个参数调用self
,将foo
作为第二个参数调用(并且将为局部变量event
分配值{ {1}})。
在您的情况下,分配给foo
的值并不重要,因为event
的正文中未使用event
。我们只需设置gpio25
即可接受零或一个参数。