为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2023-09-26 16:26:53
我正在尝试创建一个 GUI,在查看了这里的各种帖子后,我仍然感到困惑。self.state我的问题是,当我设置为不同的值时,我为反映 GPIO 按钮状态而制作的自定义按钮不会更新其外观。我认为这可能与对象构造有关,但我不知道如何修复它。main.pyimport kivykivy.require('1.11.1')from kivy.app import Appfrom kivy.uix.widget import Widgetfrom kivy.properties import NumericProperty, ObjectPropertyfrom kivy.uix.floatlayout import FloatLayoutfrom kivy.uix.button import Buttonfrom kivy.clock import Clockfrom kivy.core.window import Windowimport RPi.GPIO as GPIO# make app run in fullscreen modeWindow.fullscreen = 'auto'  # uses display's current resolution# Set up GPIOok_btn_pin = 4GPIO.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 occurclass 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)
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

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.


查看完整回答
反对 回复 2023-09-26
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信