Kivy:在 python 代码中设置小部件禁用属性

Posted

技术标签:

【中文标题】Kivy:在 python 代码中设置小部件禁用属性【英文标题】:Kivy: set widget disabled property in python code 【发布时间】:2021-03-11 07:21:35 【问题描述】:

我在 kivy lang 文件中有这样的东西(伪代码)

<RootWidget>:
    Checkbox:
        id: chkbox
    TextInput:
        id: in_text
        text: ""
    Button:
        id: ok_btn 
        label: "Okay"
        on_press: app.ok_pressed()
        disabled: chkbox.active or len(in_text.text) > 8 and ...

关键是,ok_btn 需要根据其他几个小部件的状态动态启用和禁用。

这一切都按预期工作,但现在我遇到了问题。由于复杂的原因,我需要创建按钮并将其插入到 python 的根小部件中,而不是在 .kv 文件或字符串中定义它。我不知道如何处理 disabled 属性。如果我将其设置为属性

btn = Button()
btn.disabled = ...

这仅设置初始状态。我想也许

btn.bind(on_disabled=some_function)

但这只是在按钮被禁用时做一些事情,而不是定义何时应该禁用它。同上 on_state。我也试过了

btn.bind(disabled=some_function)

some_function 永远不会被调用

提前感谢任何指针

【问题讨论】:

【参考方案1】:

听起来你倒退了:你想绑定的不是按钮的 disabled 属性,而是你想绑定到 other 的东西,这样当他们改变按钮的disabled 属性得到更新。

例如,从您的原始示例中,自动生成的代码类似于chkbox.bind(active=lambda self: setattr(ok_btn, "disabled", self.active)(实际上不是此代码,而是等效的代码)。您需要手动复制它。

当然,您可以通过各种方式对其进行抽象。例如,您可以绑定您关心的所有条件来更新 App 类的属性(以便它始终存在以更新,无论您的按钮是否存在),然后在您的按钮中使用类似 disabled: app.that_property 的 kv 规则。不过,这不是唯一的选择。

【讨论】:

以上是关于Kivy:在 python 代码中设置小部件禁用属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 文件中设置小部件的 ID?

如何在 QGridLayout 中设置小部件的顺序

使用属性窗口在 QT 网格布局中设置小部件的行和列

如何在tkinter中设置小部件的大小?

如何禁用 Kivy 中的小部件?

Kivy:在kv中设置禁用按钮上的文本颜色