如何关联main.py的Widget类与my.kv规则?MyModalView关联失败求助
仅修改kv文件实现ModalView弹窗的方案
核心问题拆解
Kivy的kv文件会自动匹配同名自定义Widget类,但ModalView默认处于隐藏状态,得通过open()触发显示,同时要保证kv规则和你的自定义类完全对应。
具体修改步骤(只改my.kv)
先假设你的main.py代码是这样的(不用动它):
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.modalview import ModalView class MyLayout(BoxLayout): pass class MyModalView(ModalView): pass class TestApp(App): def build(self): return MyLayout() if __name__ == '__main__': TestApp().run()
那直接把my.kv改成下面这样就行:
<MyLayout>: Button: text: "打开弹窗" # 按钮点击时直接创建弹窗实例并调用open方法 on_press: MyModalView().open() <MyModalView>: size_hint: 0.8, 0.5 BoxLayout: orientation: 'vertical' Label: text: "这是我的弹窗" Button: text: "关闭" on_press: root.dismiss()
关键注意点
- kv里的
<MyModalView>必须和main.py里的类名大小写完全一致,不然关联不上 - 如果不想每次点击都创建新弹窗实例,可以在MyLayout里存一个弹窗对象复用:
<MyLayout>: # 提前创建弹窗实例存在modal属性里 modal: MyModalView() Button: text: "打开弹窗" on_press: root.modal.open() <MyModalView>: # 弹窗内容和上面一样
这样改完kv,点击按钮就能弹出预期的弹窗了,完全不用碰main.py的代码。
内容的提问来源于stack exchange,提问作者shennong9527
相关产品推荐
相关产品推荐

