不能让 ids 在 Python 中工作! Kivy 新手需要帮助

问题描述

我知道你会认为我是一个绝对的新手——你是对的!!也许你们中的一些人会很友好地帮助我 :)

我正在制作一个带有屏幕的小型家用设备,用于控制和运行灯(Phillips Hue),显示天气等等。

我制作了一个运行灯的脚本,效果很好。我现在也在尝试构建一个界面。当脚本在后台运行时,界面应该在运行时更新按钮状态。

我正在尝试创建一个函数,该函数将使用 Kivy 中的时钟函数定期更新灯光。 A 尝试过使用属性,我也尝试过使用 id,但无论我尝试什么都会出错。我看到人们经常在引用 Kivy 小部件时遇到问题,而且错误似乎有些不同,需要比我对 Kivy 构建和运行方式有更多的了解。

所以也许你们中的一些专业人士可以帮助指出我做错的事情!我已经包含了 kv 文件的受影响部分以及显示我的应用程序结构的伪代码

KV 文件

<FrontPage>:

canvas.before:
    Rectangle:
        pos: self.pos
        size: self.size
        source: 'tapet2.jpg'

GridLayout:
    rows: 3
    cols: 1
    size: root.width * 1,root.height * 1

    GridLayout:
        rows: 1
        cols: 2
        Label:
            size_hint_x: 0.35
            text: "VH54 appen"
            font_size: 30

        Label:
            text: ""

    GridLayout:
        rows: 1
        cols: 5
        padding: 20
        spacing: 20
        size_hint_y: 3
        ToggleButton:
            id: alrum_knap
            text: 'Alrum'
            on_state: root.alrum_knap(self.state)

...(继续使用其他布局内容

Python 代码

from kivy.app import App,Widget    
from kivy.clock import Clock
from kivy.core.window import Window
    
class FrontPage(Widget):
        
    def update_alrum_knap(self):
        ( ... Code that defines alrum_on True or False)
        if alrum_on == True:
            FrontPage().ids.alrum_knap.state = 'down'
        else:
            FrontPage().ids.alrum_knap.state = 'normal'

    def alrum_knap(self,state):
        if state == 'down':
            Hue.ongroup(alrum_gr,sc_dag_alrum,10)
        else:
            Hue.offgroup(alrum_gr,20)

    def loop(self):
       (Contains code for running the lights)

class Vh54App(App):
    
    def build(self):
        Clock.schedule_interval(FrontPage.loop,0.5)
        Clock.schedule_interval(FrontPage.update_alrum_knap,0.5)
        return FrontPage()
        
if __name__ == '__main__':
    Vh54App().run()

非常感谢您提供的所有帮助和见解。我非常清楚我犯了各种各样的新手错误!我在生活中的其他方面做得更好,但这也很有趣:D

问候 西蒙,丹麦

解决方法

在您的代码中:

FrontPage().ids.alrum_knap.state = 'down'

FrontPage() 正在创建 FrontPage 的新实例,该实例不是出现在您的 GUI 中的实例。每当您使用类名(如 FrontPage)后跟 () 时,您都是在创建该类的新实例。

由于该代码位于 FrontPage 类的方法中,您可以简单地使用 self 参数,如下所示:

self.ids.alrum_knap.state = 'down'

此外,您在 FrontPage.loop 方法中使用 FrontPage.update_alrum_knapbuild() 是不正确的。您应该再次使用 FrontPage 的实例,如下所示:

def build(self):
    fp = FrontPage()
    Clock.schedule_interval(fp.loop,0.5)
    Clock.schedule_interval(fp.update_alrum_knap,0.5)
    return fp

您还需要向 dt 调用的方法添加 Clock 参数。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...