首页 > 解决方案 > 如何将小部件的 id 从 kivy 发送和使用到 python

问题描述

我正在尝试按 id 禁用按钮。据我所知,发送 id (pong) 不起作用。但是,对于我的最终应用程序,我无论如何都需要发送字母 A、B、... F,那么我是否可以建立一个小部件 id 的字符串并使用它来禁用它?我必须将字符串转换为另一种数据类型吗?我的.py

# main.py
from kivy.app import App
from kivy.uix.gridlayout import GridLayout


class TurboWidget(GridLayout):
    def ping(self, y):
        x = "btnStart"+y
        print(y)
        print(x)
        self.ids.x.disabled = True

    def pong(self, y):
        print(y)
        self.ids.y.disabled = True


class TurboApp(App):
    def build(self):
        return TurboWidget()


if __name__ == "__main__":
    TurboApp().run()

我的.kv

# turbo.kv
<TurboWidget>
    cols: 2
    Button:
        id: btnStartA
        text:"A"
        on_release: root.Ping("A")

    Button:
        id: btnStartB
        text:"B"
        on_release: root.Ping("B")

    Button:
        id: btnStartC
        text:"C"
        on_release: root.Pong(btnStartC.id)
    Button:
        id: btnStartD
        text:"D"
        on_release: root.Pong(btnStartD.id)

标签: pythonkivy

解决方案


您可以使用以下方法执行此操作。请注意,我在方法中将 id 作为字符串传递。另外,我self.ids[y].disabled用于从 python 端设置 kivy 属性。

# main.py
from kivy.app import App
from kivy.uix.gridlayout import GridLayout

class TurboWidget(GridLayout):
    def ping(self, y):
        self.ids[y].disabled = True

    def pong(self, y):
        print(y)
        self.ids[y].disabled = True


class TurboApp(App):
    def build(self):
        return TurboWidget()


if __name__ == "__main__":
    TurboApp().run()

并使用与 main.py 相同的文件夹中的以下 kv 文件。

# turbo.kv
<TurboWidget>
    cols: 2
    Button:
        id: btnStartA
        text:"A"
        on_press: root.ping("btnStartA")

    Button:
        id: btnStartB
        text:"B"
        on_press: root.ping("btnStartB")

    Button:
        id: btnStartC
        text:"C"
        on_press: root.pong("btnStartC")

    Button:
        id: btnStartD
        text:"D"
        on_press: root.pong("btnStartD")

推荐阅读