不能让 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.loop
和 FrontPage.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 最终在 Eclipse 中工作,编译然后错误:CRITICAL Application No window is created.Terminating application run