2017-04-02 9 views
1

私はこれで数日間頭を悩まされました。私はそれをPythonでのみ動作させました(.kvファイルを使用しない)が、今私はこれを理解できません。KivyからPythonへのコールバックにボタンをバインドします

基本的には、ラズベリーパイのGPIOを制御する一連のボタンがあります。 Pythonのみのバージョンでは、アクティブにするピンを決定するための右ボタン "テキスト"を探してIFのセリフで1回コールバックします。今、kivyバージョンでは、私は1つのボタンにダウンして、コード内の多くの場所にコールバックを移動しましたが、何も動作していないようです。ここで

はpytonのコードは次のとおりです。

# Set up GPIO: 
GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BCM) 
defrost = 27 
GPIO.setup(defrost, GPIO.OUT) 
GPIO.output(defrost, GPIO.LOW) 


class ConsoleUI(BoxLayout): 
    def press_callback(obj): 

      if obj.state == "down": 
       GPIO.output(defrost, GPIO.HIGH) 
      else: 
       GPIO.output(defrost, GPIO.LOW) 

    pass 

class ConsolesimpleApp(App): 
    def build(self): 
     return ConsoleUI() 


if __name__ == '__main__': 
    ConsolesimpleApp().run() 

GPIO.cleanup() 

ここKVのコードは次のとおりです。

# Console.kv 


<ConsoleUI>: 

    ToggleButton: 
     id: Defrost 
     on_press: root.press_callback() 
     Image: 
      source: 'rear-window-defrost.png' 

と現在のエラーメッセージ:

AttributeError: 'ConsoleUI' object has no attribute 'state' 

はあなたが私を与えることができます任意のポインタをありがとう!

ボーナスの質問:ボタンごとに個別のコールバックを持つ方がよいか、「if obj.text ==」標準ですか?私はこの問題は、あなたが本当にこのケースでobjselfを言うと同じなので、BoxLayout(ConsoleUI)の状態をチェックしてpress_callback(obj)に何をしているか、である...

答えて

1

を私のボタンのテキストを持っていないので、 。あなたが見るように、boxlayoutには状態属性はありません。
本当にやりたいことは、トグルボタンの状態を確認することです。幸運にもあなたはすでにIDを与えていましたので、あなたのメソッドを次のように変更してみてください。

def press_callback(self): 

     if self.ids.Defrost.state == "down": 
      GPIO.output(defrost, GPIO.HIGH) 
     else: 
      GPIO.output(defrost, GPIO.LOW) 

そしてあなたのボーナスの質問に答えてください。
コールバックに物を渡すことができます。だから私はボタン自体とピン番号を渡します。今あなたは私が上で言ったことを実際に忘れることができます。

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.boxlayout import BoxLayout 


Builder.load_string(''' 

<ConsoleUI>: 

    ToggleButton: 
     on_press: root.press_callback(self,1) 

    ToggleButton: 
     on_press: root.press_callback(self,2) 

    ToggleButton: 
     on_press: root.press_callback(self,3) 

''') 


class ConsoleUI(BoxLayout): 

    def press_callback(self,button,pin): 
      if button.state == "down": 
       print("pin {} goes high".format(pin)) 
      else: 
       print("pin {} goes low".format(pin)) 



class ConsolesimpleApp(App): 
    def build(self): 
     return ConsoleUI() 


if __name__ == '__main__': 
    ConsolesimpleApp().run() 
+0

恐ろしい:
は、私が何を意味するか確認するために、この小さな例を実行してみてください!非常に完全な答えをありがとう。私は提案されたコードを試して、それは動作します!あなたはロック! – GroanMan

+0

@GroanManあなたはウェルカムです:) – EL3PHANTEN

+0

@GroanManはそれが受け入れられる回答か、他の何かを探していますか? – EL3PHANTEN

関連する問題