2017-04-02 31 views
1

我一直在为此敲打我的头几天。我只在Python中工作(不使用.kv文件),但现在我无法弄清楚。将一个按钮绑定到一个从Kivy到python的回调

基本上,我将有一系列按钮来控制树莓派上的GPIO。在仅Python版本中,我有一个回调函数,并寻找正确的按钮“文本”以确定要激活的引脚。现在在kivy版本中,我将它简化为一个按钮,将回调移动到代码中的许多地方等,但似乎没有任何工作。

这里的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 ==”标准是更好的形式吗?因为我不会对我的按钮文字...

回答

1

的问题是,你真的正在做press_callback(obj)在这种情况下,正在检查的BoxLayout(ConsoleUI)的状态,因为obj是相同的话说self 。正如你所看到的,boxlayout没有任何状态属性。
所以你真正想要做的是检查togglebutton的状态。幸运的是,你已经给它一个ID,所以试着改变你的方法是这样的:

def press_callback(self): 

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

并回答你的奖金问题。
你可以传递东西到回调。所以我会通过按钮本身和PIN码。现在你实际上可以忘记我上面所说的。
尝试运行这个小例子,看看我的意思:

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

相关问题