我目前在MDCheckbox方面遇到一些问题。当我使用默认的Kivy Checkbox时,on_active
代码中的kv
参数似乎工作得很好。但是现在,我尝试将KivyMD MDCheckbox
模块与MDList
结合使用,并尝试通过on_active
参数将功能添加到Checkbox:
#:kivy 1.11.0
#:import MDCard kivymd.card.MDCard
#:import MDCheckbox kivymd.selectioncontrols.MDCheckbox
#:import MDList kivymd.list.MDList
#:import OneLineAvatarIconListItem kivymd.list.OneLineAvatarIconListItem
<ListItemWithCheckbox@OneLineAvatarIconListItem>:
MyAvatar:
source: 'src/hdl.jpg'
MyCheckbox:
<LayoutPy>
orientation: 'vertical'
FloatLayout:
MDCard:
size_hint: .8, .5
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
BoxLayout:
orientation: 'horizontal'
spacing: 20
name: 'lists'
ScrollView:
MDList:
id: scroll
ListItemWithCheckbox:
id: ckbx1
text: 'Box 1'
active: False
on_active: root.printS('Text 1')
ListItemWithCheckbox:
id: ckbx2
text: 'Box 2'
active: False
on_active: root.printS('Text 2')
ListItemWithCheckbox:
id: ckbx3
text: 'Box 3'
active: False
on_active: root.printS('Text 3')
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivymd.theming import ThemeManager
from kivy.uix.image import Image
from kivymd.list import IRightBodyTouch, ILeftBody
from kivymd.selectioncontrols import MDCheckbox
from kivy.lang import Builder
class LayoutPy(FloatLayout):
def __init__(self, **kwargs):
super(LayoutPy, self).__init__(**kwargs)
def printS(self, text):
print(text)
class MyCheckbox(IRightBodyTouch, MDCheckbox):
pass
class MyAvatar(ILeftBody, Image):
pass
Builder.load_file(design.kv)
class KivyGUI(App):
theme_cls = ThemeManager()
theme_cls.primary_palette = ("Teal")
title = ("App")
def build(self):
c = LayoutPy()
return c
if __name__ == "__main__":
KivyGUI().run()
我认为,与普通的Kivy不同,KivyMD需要一个附加的active
参数才能将功能添加到MDCheckbox。我尝试设置布尔值True / False的active
参数(我尝试了两者,但似乎没有任何效果)。我更改了代码的某些部分以使其更容易使用,但是如果您想看一下原始源代码,可以查看它here。 (在原始源代码中,MDCheckboxes
位于第143行。
非常感谢!
答案 0 :(得分:1)
on_active
事件。
动态类规则<ListItemWithCheckbox@OneLineAvatarIconListItem>:
仅具有OneLineAvatarIconListItem
的继承,而没有MDCheckbox
的继承。因此,on_active
处于活动状态时不会触发MDCheckbox
事件,并且该事件被放错位置。
msg
保留不同的文本。on_active
下实施MDCheckbox:
事件msg
下将文本分配给ListItemWithCheckbox:
<ListItemWithCheckbox@OneLineAvatarIconListItem>:
msg: ''
MyAvatar:
source: 'src/hdl.jpg'
MyCheckbox:
on_active: app.root.printS(root.msg)
...
ListItemWithCheckbox:
id: ckbx1
text: 'Box 1'
msg: 'Text 1'
ListItemWithCheckbox:
id: ckbx2
text: 'Box 2'
msg: 'Text 2'
ListItemWithCheckbox:
id: ckbx3
text: 'Box 3'
msg: 'Text 3'