[英]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.root
( global root
和root=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.