繁体   English   中英

Kivy-无法从KV语言之外的功能更改按钮状态

[英]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.rootglobal rootroot=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM