[英]Kivy - cannot change button state from function outside kv language
我正在尝试从功能更改ToggleButton的状态。
我能够使状态更改生效的唯一方法是,如果更改状态的函数位于根窗口小部件中,并且我从kv语言中调用了该函数。
这是我为测试问题而设置的一些简化代码:
python代码:
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
class MainPanel(BoxLayout):
def togOn(self):
self.ids.node1_power.state = 'down'
class avcsServerApp(App):
def build(self):
global root
root = self.root
return Builder.load_file('avcsserver.kv')
def press(self):
root.togOn()
if __name__ == '__main__':
avcsServerApp().run()
验证码:
<Button>:
font_size: 20
color: .12,.13,.14,1
border: 25, 25, 25, 25
background_down: 'buttono.png'
background_normal: 'button.png'
MainPanel:
canvas:
Color:
rgba: .12,.13,.14,1
Rectangle:
pos: self.pos
size: self.size
ToggleButton:
id: node1_power
text: "POWER"
Button:
text: "TOGGLE"
on_release: app.press()
直接从kv代码(即on_release: root.togOn()
)调用togOn()
函数时,它可以按预期工作,但是通过press()
调用它无法更新按钮状态。
另外,将root.ids.node1_power.state = 'down'
类的东西直接放在press()
函数中也不起作用。
我怀疑我用来通过我的Python代码引用root窗口小部件的方法root=self.root
,因为它似乎root=self.root
( global root
和root=self.root
行),但是我是Kivy和Python的新手,这是我发现的唯一方法。
整个global root
确实是一个坏主意。 你很亲近 以下python代码应按预期工作。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
class MainPanel(BoxLayout):
# Not need for the togOn method
pass
class avcsServerApp(App):
def build(self):
return Builder.load_file('avcsserver.kv')
def press(self):
# The root attribute is readily available inside the app
# class instance.
self.root.ids.node1_power.state = "down" if \
self.root.ids.node1_power.state != "down" else "normal"
if __name__ == '__main__':
avcsServerApp().run()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.