簡體   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