【问题标题】:In Python/KivyMD. MDDialog with check boxes where "CONFIRM" button doesn't work if one of check boxes are checked在 Python/KivyMD 中。带有复选框的 MDDialog,如果选中其中一个复选框,则“确认”按钮不起作用
【发布时间】:2021-07-15 12:03:11
【问题描述】:

我用python 3.9.5kivy 2.0.0rc4kivymd 0.104.2 做了一个游戏。我制作了 MDDialog。其中有复选框。如果没有选中它们,我想禁用“确认”按钮。如果其中一个被选中,我想启用“确认”按钮。当没有检查任何一个时,我已经设法禁用,但是如果我检查其中一个,按钮仍然被禁用。这是我的python 代码:

class ItemConfirm(OneLineAvatarIconListItem):
    divider = None
    dialog = None

    def show_confirmation_dialog(self, *args):

        self.dialog = MDDialog(
            title="Score Limit",
            type="confirmation",
            auto_dismiss=False,
            items=[
                ItemConfirm(text="30"),
                ItemConfirm(text="40"),
                ItemConfirm(text="50"),
                ItemConfirm(text="60"),
            ],
            buttons=[
                MDFlatButton(
                    text="CONFIRM", text_color=(1, 0, 0, 1), on_release=self.score_limit, disabled=True if self.ids.check.active == False else False
                ),
            ]
        )
        self.dialog.open()

    def score_limit(self, *args, **kwargs):
        self.dialog.dismiss()

这是我的kivy 代码:

<ItemConfirm>

    CheckboxLeftWidget:
        id: check
        group: "check"

【问题讨论】:

  • 我也想知道是否可以为 MDDialog 中的按钮提供 id。如果可以,我想知道如何

标签: python kivy kivymd


【解决方案1】:

您可以通过定义反映是否有任何复选框处于活动状态的BooleanProperty 来启用/禁用confirm 按钮。最简单的方法是利用 kivy lang 创建的自动绑定。为了做到这一点,我基本上不得不重新编写你的代码。对于重写,我深表歉意,但这里是您的代码的修订版,可以满足您的要求:

from kivy.lang import Builder
from kivy.properties import BooleanProperty
from kivy.uix.button import Button
from kivymd.app import MDApp
from kivymd.uix.dialog import MDDialog
from kivymd.uix.list import OneLineAvatarIconListItem
from kivymd.uix.selectioncontrol import MDCheckbox

kv = '''
#:import Factory kivy.factory.Factory
<ItemConfirm>
    divider: None
    CheckboxRightWidget:
        id: check
        score: root.text  # makes the score text available from the Checkbox
        group: "check"
        on_active: app.check_active(self.group)  # update app.active
        
<ConfirmButton@MDFlatButton>:
    text: 'CONFIRM'
    disabled: not app.active  #  disabled when app.active is False
    on_release: app.score_limit()
    
<ConfirmDialog>:
    title: "Score Limit"
    type: "confirmation"
    auto_dismiss: False
    items: [ Factory.ItemConfirm(text="30"), Factory.ItemConfirm(text="40"), Factory.ItemConfirm(text="50"), Factory.ItemConfirm(text="60") ]
    buttons: [ Factory.ConfirmButton() ]
'''


class ItemConfirm(OneLineAvatarIconListItem):
    pass


class ConfirmDialog(MDDialog):
    pass


class TestApp(MDApp):
    active = BooleanProperty(False)  # keeps track if any Checkbox is active

    def build(self):
        Builder.load_string(kv)
        return Button(text='Do It', on_release=self.show_confirmation_dialog)

    def show_confirmation_dialog(self, *args):
        self.dialog = ConfirmDialog()
        self.dialog.open()

    def score_limit(self, *args, **kwargs):
        print('score limit:', self.check_active('check'))
        self.dialog.dismiss()
        self.dialog = None  # required to eliminate current group of Checkboxes
        self.active = False

    def check_active(self, group):  # update app.active and return current score limit (or None)
        for cb in MDCheckbox.get_widgets(group):
            if cb.active:
                self.active = True
                return cb.score
        self.active = False
        return None


TestApp().run()

由于必须构建MDDialog 的方式(buttons 必须是Button 对象的列表),我不知道有什么方法可以将id 分配给那些Buttons

【讨论】:

  • 我认为它会工作,但我如何打开 MDDialog。有了这个新代码,我无法弄清楚。我有一个按钮可以将我发送到另一个班级,我希望它出现在下一节课上(顺便说一句,感谢您帮助我)
  • 你能用不同的方式编写kivy代码吗?它对我不起作用,因为我已经分离了 kivy 和 python 代码。这个“#:import Factory kivy.factory.Factory”和“:”对我不起作用
  • 您通过调用show_confirmation_dialog() 方法打开MDDialog.kv.py 的单独文件不是问题,只需将 kv 字符串复制到您的 .kv 文件中即可。
  • 我做了每一件事。它显示带有按钮和标题的 MDDialog,但其中没有任何内容
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2015-09-22
  • 2021-12-24
  • 2022-11-27
相关资源
最近更新 更多