2017-03-06 29 views
0

我試圖從函數中更改ToggleButton的狀態。Kivy - 不能更改kv語言之外的按鈕狀態功能

我已經能夠讓狀態更改工作的唯一方法是如果更改狀態的函數位於根窗口小部件中,並且我從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直接調用togOn()功能代碼(即on_release: root.togOn()),它按預期工作,但通過press()調用它無法更新按鈕狀態。

或者,將類似root.ids.node1_power.state = 'down'直接放入press()函數也不起作用。

我懷疑我使用的是通過我的Python代碼來引用根插件的方法是難辭其咎的,因爲似乎正確的(在global rootroot=self.root線)沒有,但我是新來的Kivy和Python,這是我發現的唯一途徑。

+0

是的,整個'gloabl根'的東西是愚蠢的,打破了東西。直接使用'self.root'解決了我的問題。我不知道爲什麼有人推薦這種方法... – ebuenger

回答

0

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