3

テストしたいRaspberryPiのGPIO用のハードウェアをいくつか作成しました。8つの出力用に8つのボタンを作成し、それらの状態を切り替えることができる、きちんとしたPythonコードを見つけました。私は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()
4

1 に答える 1

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)keypress1イベントをメソッド呼び出しにバインドしますself.gpio25(event)master.bindキーごとに1つずつ、さらに7つの呼び出しが必要になります。

次に、コールバック関数の定義を変更します。それぞれに2番目の引数、を追加する必要がありeventます。たとえば、変更します。

def gpio25(self):

def gpio25(self, event = None):

説明:

このメソッドを使用すると、をコールバック関数にbindバインドしEventます(例self.gpio25)。キーを押すことはKeyPressイベントです。イベントに関する情報は、Eventオブジェクトのコールバックに送信されます。したがって、コールバック関数は1つの引数を取る必要があります。詳細については、Tkinterイベントとバインディングを参照してください。

Buttons動作が異なります。それらのコールバック関数は、ゼロ引数で呼び出されます。

KeypressイベントコールバックとButtonコールバックの両方として同じコールバック関数を使用しているためself.gpio25、ゼロまたは1つの引数を取ることができる関数である必要があります。

Pythonでは、これを行う方法は、次のgpio25ような呼び出しシグネチャで定義することです。

def gpio25(self, event = None):

selfクラスのインスタンスですApp。は、最初の引数self.gpio25がboundであるboundメソッドです。selfしたがって、呼び出すと、最初の引数として関数self.gpio25()が呼び出されます(ローカル変数には値が割り当てられます)。呼び出しは、最初の引数として、および2番目の引数として呼び出します(ローカル変数には値が割り当てられます)。gpio25selfeventNoneself.gpio25(foo)gpio25selffooeventfoo

あなたの場合、に割り当てられた値eventは実際には重要ではありません。これeventは、の本体で使用されていないためですgpio25self.gpio25ゼロまたは1つの引数を受け入れる準備ができるように設定する必要がありました。

于 2012-12-07T23:29:48.380 に答える