带 MDCheckbox 的条件语句
Conditional statements with MDCheckbox
我想检查复选框状态是否为 down/normal(True/False) 并执行进一步的代码
我试过了
if self.root.ids.chk_box.active==True:
print('True')
else:
print('False')
但是不能正常使用
编辑:
完整代码
from kivy.lang import Builder
from kivy.factory import Factory
from kivymd.uix.selectioncontrol import MDCheckbox
Root="""
#:import F kivy.factory.Factory
<Obj_1@BoxLayout>:
MDCheckbox:
id:chk_box
BoxLayout:
id:Layout_1
MDRectangleFlatButton:
text:"Add"
on_press:root.add_widget(F.Obj_1())
MDRectangleFlatButton:
text:"print state"
on_press:app.State()
"""
class Main(MDApp):
def build(self):
return Builder.load_string(Root)
def State(self):
self.Obj_1=Factory.Obj_1()
if self.Obj_1.ids.chk_box.active==True:
print('True')
else:
print("False")
Main().run()
在上面的代码中,添加按钮将复选框添加到主布局中,然后有一个按钮'print state'知道状态
你可以清楚地看到即使Checkbox状态为True它也一直在打印False
如果 MDCheckbox 没有放在 Factory 对象中,同样的事情也能正常工作
注意:这是为了了解复选框的状态,我肯定知道 on_active:
功能,但我不能使用那个
您的代码有几个问题:
- 在您的
State()
方法中,代码 self.Obj_1=Factory.Obj_1()
正在创建 Obj_1
的新实例。该新实例与出现在您的 GUI 中的实例没有任何关系,因此检查其状态是没有用的。
- 同样在您的
State()
方法中,代码:if self.Obj_1.ids.chk_box==True:
未检查 state
(或 active
属性) 18=].
kv
中的代码:on_press:root.add_widget(F.Obj_1())
创建了 Obj_1
的新实例,但不保留对该实例的引用。这使得很难访问 Obj_1
实例来检查它的 state
.
这是解决上述问题的代码修改版本:
from kivy.lang import Builder
from kivy.factory import Factory
from kivymd.app import MDApp
Root = """
#:import F kivy.factory.Factory
<Obj_1@BoxLayout>:
MDCheckbox:
id:chk_box
BoxLayout:
id:Layout_1
MDRectangleFlatButton:
text:"Add"
# on_press:root.add_widget(F.Obj_1())
on_press: app.add_Obj() # call a method of the App, rather than creating the Obj_1 instance here
MDRectangleFlatButton:
text:"print state"
on_press:app.State()
"""
class Main(MDApp):
def build(self):
return Builder.load_string(Root)
def add_Obj(self):
# create a new instance of `Obj_1` and save a reference to it
self.Obj_1 = Factory.Obj_1()
self.root.add_widget(self.Obj_1)
def State(self):
# self.Obj_1 = Factory.Obj_1()
if self.Obj_1.ids.chk_box.active == True: # Check the `active` property of the `Obj_1` instance
print('True')
else:
print("False")
Main().run()
我想检查复选框状态是否为 down/normal(True/False) 并执行进一步的代码
我试过了
if self.root.ids.chk_box.active==True:
print('True')
else:
print('False')
但是不能正常使用
编辑: 完整代码
from kivy.lang import Builder
from kivy.factory import Factory
from kivymd.uix.selectioncontrol import MDCheckbox
Root="""
#:import F kivy.factory.Factory
<Obj_1@BoxLayout>:
MDCheckbox:
id:chk_box
BoxLayout:
id:Layout_1
MDRectangleFlatButton:
text:"Add"
on_press:root.add_widget(F.Obj_1())
MDRectangleFlatButton:
text:"print state"
on_press:app.State()
"""
class Main(MDApp):
def build(self):
return Builder.load_string(Root)
def State(self):
self.Obj_1=Factory.Obj_1()
if self.Obj_1.ids.chk_box.active==True:
print('True')
else:
print("False")
Main().run()
在上面的代码中,添加按钮将复选框添加到主布局中,然后有一个按钮'print state'知道状态
你可以清楚地看到即使Checkbox状态为True它也一直在打印False
如果 MDCheckbox 没有放在 Factory 对象中,同样的事情也能正常工作
注意:这是为了了解复选框的状态,我肯定知道 on_active:
功能,但我不能使用那个
您的代码有几个问题:
- 在您的
State()
方法中,代码self.Obj_1=Factory.Obj_1()
正在创建Obj_1
的新实例。该新实例与出现在您的 GUI 中的实例没有任何关系,因此检查其状态是没有用的。 - 同样在您的
State()
方法中,代码:if self.Obj_1.ids.chk_box==True:
未检查state
(或active
属性) 18=]. kv
中的代码:on_press:root.add_widget(F.Obj_1())
创建了Obj_1
的新实例,但不保留对该实例的引用。这使得很难访问Obj_1
实例来检查它的state
.
这是解决上述问题的代码修改版本:
from kivy.lang import Builder
from kivy.factory import Factory
from kivymd.app import MDApp
Root = """
#:import F kivy.factory.Factory
<Obj_1@BoxLayout>:
MDCheckbox:
id:chk_box
BoxLayout:
id:Layout_1
MDRectangleFlatButton:
text:"Add"
# on_press:root.add_widget(F.Obj_1())
on_press: app.add_Obj() # call a method of the App, rather than creating the Obj_1 instance here
MDRectangleFlatButton:
text:"print state"
on_press:app.State()
"""
class Main(MDApp):
def build(self):
return Builder.load_string(Root)
def add_Obj(self):
# create a new instance of `Obj_1` and save a reference to it
self.Obj_1 = Factory.Obj_1()
self.root.add_widget(self.Obj_1)
def State(self):
# self.Obj_1 = Factory.Obj_1()
if self.Obj_1.ids.chk_box.active == True: # Check the `active` property of the `Obj_1` instance
print('True')
else:
print("False")
Main().run()