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

Posted

技术标签:

【中文标题】不能让 id 在 Python 中工作! Kivy 新手需要帮助【英文标题】:Can't make ids work in Python! Help needed for Kivy newbie 【发布时间】:2021-01-12 21:35:57 【问题描述】:

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

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

问候 丹麦西蒙

【问题讨论】:

【参考方案1】:

在您的代码中:

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

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

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

self.ids.alrum_knap.state = 'down'

另外,您在 build() 方法中对 FrontPage.loopFrontPage.update_alrum_knap 的使用不正确。您应该再次使用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 调用的那些方法中。

【讨论】:

约翰,你是我的英雄!!!!这一切都是有道理的,现在一切正常! - 实际上,我对自己创建一个额外的实例有点理解,但我错过的是为时钟调用的两个函数添加“dt”以使其工作的部分。如果不是因为病毒,我会拥抱你——我已经玩了好几个小时了。非常感谢 :D :D 谢谢! 好的,我只有一个后续问题。在我看来,在上面的代码中更改按钮的状态也会激活 kv 文件中的“on_state”代码。是否可以只更改按钮的状态而不实际“按下”按钮? 我认为没有任何合理的方法可以避免on_state 事件。但是您可以在更改状态之前设置一个标志(类似于self.ignore_on_state=True),然后您的alrum_knap() 方法可以检查该标志,如果True,只需将其重置为False 并返回。需要注意确保您没有设置该标志,除非您实际上正在更改状态。 是的,这是一个可能的解决方案。但事实证明,如果我在 kv 文件中使用“on_press”而不是“on_state”来链接回 Python 中的函数,当我更改状态时它不会运行代码:) 再次感谢您帮助我!

以上是关于不能让 id 在 Python 中工作! Kivy 新手需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

python 简单的数据网格为kivy。 (在python 3和2中工作)

Kivy-Python 在多处理中工作,再打开一个白屏

让 Kivy 最终在 Eclipse 中工作,编译然后错误:CRITICAL Application No window is created.Terminating application run

文本输入突然停止在 Kivy 应用程序中工作

为啥我不能让运动显着性在 OpenCV C++ 中工作?

如何使可编辑标签在kivy中工作