将按钮绑定到从 Kivy 到 Python 的回调

问题描述 投票:0回答:1

我已经为此苦恼好几天了。我只让它在 Python 中工作(不使用 .kv 文件),但现在我无法弄清楚这一点。

基本上,我将使用一系列按钮来控制 Raspberry Pi 上的 GPIO。在仅限 Python 的版本中,我有一个回调,其中包含一系列 IF 来查找右侧按钮“文本”以确定要激活哪个引脚。现在在 kivy 版本中,我将其简化为单个按钮,将回调移动到代码中的许多位置等,但似乎没有任何效果。

这是Python代码:

# 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”对象没有属性“state”

感谢您给我的任何指点!

额外问题:为每个按钮提供不同的回调是更好的形式还是“if obj.text ==”标准?因为我的按钮上不会有文字...

python-3.x button callback kivy raspberry-pi3
1个回答
1
投票

问题是,您在

press_callback(obj)
中真正做的是检查 BoxLayout (
ConsoleUI
) 的状态,因为在这种情况下
obj
与所说的
self
相同。正如你所看到的,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()
© www.soinside.com 2019 - 2024. All rights reserved.