0

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

我正在制作一个带有屏幕的小型家用设备,用于控制和运行灯光(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)

...(继续进行其他布局)

蟒蛇代码:

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

问候西蒙,丹麦

4

1 回答 1

1

在您的代码中:

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

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

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

self.ids.alrum_knap.state = 'down'

另外,您在方法中使用FrontPage.loopand是不正确的。您应该再次使用 的实例,如下所示: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.

于 2021-01-12T21:44:24.340 回答