按下按键时跳转到函数

3
我为我的树莓派GPIO制作了一些硬件,我想测试一下。我找到了一些不错的Python代码,可以为8个输出创建8个按钮,并允许您切换它们的状态。我几乎没有Python知识,但我想通过键盘(例如数字1-8)来切换这8个输出。我不知道如何请求键盘输入而不暂停程序流,然后在响应后继续。

如何使数字1-8“中断”我的程序并跳转到8个对应函数之一?

我的代码:

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()
1个回答

2

__init__方法中添加master.bind(...)命令:

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)将按键事件1与方法调用self.gpio25(event)绑定。 您需要进行7次更多的 master.bind调用 - 每个按键一个。

接下来,修改回调函数的定义。您需要为每个回调函数添加第二个参数event。例如,更改:

def gpio25(self):

to

def gpio25(self, event = None):

说明:

当您使用bind方法时,您正在将Event与回调函数(例如self.gpio25)绑定。按键是KeyPress事件。事件的信息以Event对象的形式发送到回调函数中。因此,回调函数必须接受一个参数。 有关更多信息,请参见Tkinter事件和绑定

按钮的工作方式不同。它们的回调函数被调用时不带任何参数。

由于我们正在使用相同的回调函数self.gpio25作为Keypress事件回调和Button回调,因此它必须是一个可以接受零个或一个参数的函数。

在Python中,要做到这一点,定义gpio25的调用签名如下:

def gpio25(self, event = None):
selfApp类的一个实例。 self.gpio25是一个绑定方法,其第一个参数绑定为self。因此,调用self.gpio25()将使用self作为第一个参数调用gpio25函数(并且本地变量event将被分配值None)。调用self.gpio25(foo)将使用self作为第一个参数,foo作为第二个参数调用gpio25(并且本地变量event将被分配值foo)。
在您的情况下,分配给event的值并不重要,因为eventgpio25的主体中未使用。我们只需要设置self.gpio25以准备接受零个或一个参数。

太棒了,我稍后会试一下看看效果如何 :) - user985867
你能解释一下 "event = none" 部分吗? - user985867

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接