python - 如何将小部件的 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)
解决方案
您可以使用以下方法执行此操作。请注意,我在方法中将 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")
推荐阅读
- java - Flink DataStream - 如何从输入元素启动源?
- python - Python 打字:如何让 Type[C] 与 TypeVars 和泛型一起工作?
- java - 为什么我的输出会抛出异常,而我只(看似)更改了一个变量?
- outlook - 仅通过 Laravel 应用程序通过 Outlook 生成的重复电子邮件
- asp.net-mvc - 在哪里查找 Azure SQL Server 连接的用户 ID 和密码
- centos - 从 Cacti 生成的 rrd 文件中获取最大值和最小值
- excel - 更新文本框顺序后的 VBA 用户表单(Excel)
- python - Python Flask Node.js 加载资源失败 404
- azure - Microsoft 的 Azure ARM 模板中的“Flow_type”属性是什么?
- java - View 无法转换为 MotionEvent 和 MotionEvent 无法转换为 View