Kivy:自定义按钮不随 self.state 更改而更新

我正在尝试创建一个 GUI,在查看了这里的各种帖子后,我仍然感到困惑。self.state我的问题是,当我设置为不同的值时,我为反映 GPIO 按钮状态而制作的自定义按钮不会更新其外观。我认为这可能与对象构造有关,但我不知道如何修复它。


main.py

import kivy

kivy.require('1.11.1')


from kivy.app import App

from kivy.uix.widget import Widget

from kivy.properties import NumericProperty, ObjectProperty

from kivy.uix.floatlayout import FloatLayout

from kivy.uix.button import Button

from kivy.clock import Clock

from kivy.core.window import Window

import RPi.GPIO as GPIO


# make app run in fullscreen mode

Window.fullscreen = 'auto'  # uses display's current resolution


# Set up GPIO

ok_btn_pin = 4

GPIO.setmode(GPIO.BCM)

GPIO.setup(ok_btn_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.add_event_detect(ok_btn_pin, GPIO.BOTH)    #detect if GPIO.RISING or GPIO.FALLING occur



class GPIOButton(Button):


    btn_gpio_pin = NumericProperty(-1)


    def __init__(self, **kwargs):

        super(GPIOButton, self).__init__(**kwargs)

        print("GPIOButton __init__ called")

        print("btn_gpio_pin =", self.btn_gpio_pin)


    def update(self, dt):

        #print("GPIOButton update() called")

        if GPIO.input(self.btn_gpio_pin) == GPIO.HIGH and GPIO.event_detected(self.btn_gpio_pin):

            self.state = 'down'            

            print("Pin", self.btn_gpio_pin, self.state)

        elif GPIO.input(self.btn_gpio_pin) == GPIO.LOW and GPIO.event_detected(self.btn_gpio_pin):

            self.state = 'normal'

            print("Pin", self.btn_gpio_pin, self.state)



class LeftSidebar(FloatLayout):


    ok_btn = GPIOButton(btn_gpio_pin = ok_btn_pin)


    def __init__(self, **kwargs):

        super(LeftSidebar, self).__init__(**kwargs)

        print("LeftSidebar __init__ called")


    def update(self, dt):

        #print("LeftSidebar update() called")

        self.ok_btn.update(dt)

倚天杖
浏览 94回答 1
1回答

海绵宝宝撒

of被调用两次__init__()。当您的方法被调用并执行时GPIOButton一次。这将创建通过规则出现在 GUI 中的。该方法在您的类中执行时会再次调用。第二次调用创建的实例不会出现在 GUI 中,但它是该方法中引用的实例。build()self.root = LifterGUI()GPIOButtonkv__init__()ok_btn = GPIOButton(btn_gpio_pin = ok_btn_pin)LeftSidebarGPIOButtonupdate()GPIOButton由于您已经在 中设置了对 的引用kv,因此您可以修改该类LeftSidebar以使用该引用:class LeftSidebar(FloatLayout):    ok_btn_button = ObjectProperty(None)    def __init__(self, **kwargs):        super(LeftSidebar, self).__init__(**kwargs)        print("LeftSidebar __init__ called")    def update(self, dt):        #print("LeftSidebar update() called")        self.ok_btn_button.update(dt)ok_btn_button在 your和kvtheok_btn_button中设置对 中内置的 的LeftSidebar引用。这样您就可以参考类中使用的按钮。GPIOButtonkvself.ok_btn_buttonLeftSidebar请注意,您的LifterGUI.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python