【发布时间】: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 root 和 root=self.root 行),但我是 Kivy 的新手和 Python,这是我发现这样做的唯一方法。
【问题讨论】:
-
是的,整个
gloabl root的事情很愚蠢并且会破坏事情。直接使用self.root就解决了我的问题。我不知道为什么有人推荐这种方法......
标签: python widget kivy state togglebutton