【问题标题】:Kivy - cannot change button state from function outside kv languageKivy - 无法从 kv 语言以外的功能更改按钮状态
【发布时间】:2017-03-06 03:24:56
【问题描述】:

我正在尝试通过函数更改 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()

kv代码:

<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 代码引用根小部件的方法是罪魁祸首,因为它似乎不正确(global rootroot=self.root 行),但我是 Kivy 的新手和 Python,这是我发现这样做的唯一方法。

【问题讨论】:

  • 是的,整个gloabl root 的事情很愚蠢并且会破坏事情。直接使用self.root就解决了我的问题。我不知道为什么有人推荐这种方法......

标签: python widget kivy state togglebutton


【解决方案1】:

整个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()

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多