2017-03-06 27 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() 

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からtogOn()関数を呼び出しますコード(つまり、on_release: root.togOn())、期待どおりに動作しますが、press()によって呼び出すと、ボタンの状態が更新されません。

root.ids.node1_power.state = 'down'のようなものを直接press()関数に入れることもできません。

私がPythonコードでルートウィジェットを参照するために使用している方法は、適切ではないように(非難する)と思われますが、私は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() 
関連する問題