使用KivyMD MDChip组件报KeyError: 'pos_hint'错误如何解决
问题复现
使用KivyMD的MDChip组件开发时,运行代码抛出KeyError: 'pos_hint'错误,测试代码如下:
from kivy.lang import Builder from kivymd.app import MDApp class MyApp(MDApp): def build(self): return Builder.load_string(KV) KV = ''' MDBoxLayout: pos_hint: {'center_y': 1, 'center_x':1} MDChip: text: 'Google' icon: 'Google' check: True ''' MyApp().run()
完整错误追踪栈:
Traceback (most recent call last): File "c:\Users\Kelvin Loh\Documents\kivyMD\chip_1.py", line 18, in <module> MyApp().run() File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\app.py", line 949, in run self._run_prepare() File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\app.py", line 919, in _run_prepare root = self.build() File "c:\Users\Kelvin Loh\Documents\kivyMD\chip_1.py", line 6, in build return Builder.load_string(KV) File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\lang\builder.py", line 408, in load_string self._apply_rule( File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\lang\builder.py", line 661, in _apply_rule child.apply_class_lang_rules( File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\uix\widget.py", line 463, in apply_class_lang_rules Builder.apply( File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\lang\builder.py", line 541, in apply self._apply_rule( File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\lang\builder.py", line 663, in _apply_rule self._apply_rule( File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\lang\builder.py", line 660, in _apply_rule widget.add_widget(child) File "C:\Users\Kelvin Loh\Documents\kivyMD\kivy_venv\lib\site-packages\kivy\uix\floatlayout.py", line 135, in add_widget widget.bind( File "kivy\_event.pyx", line 429, in kivy._event.EventDispatcher.bind KeyError: 'pos_hint'
报错原因
- 根布局直接使用
MDBoxLayout时,MDChip在开启check: True属性后会动态插入勾选标记组件,插入过程中会触发FloatLayout类布局的pos_hint绑定校验逻辑,MDBoxLayout不属于FloatLayout系布局,无法完成属性绑定直接抛错。 - 代码中传入的icon值
'Google'不符合KivyMD图标命名规范,Material图标名均为全小写格式,该问题不会触发本次的KeyError,但会导致图标加载失败。
修复方案
将根布局替换为FloatLayout系的MDScreen(KivyMD推荐作为页面根容器),同时修正图标名,给MDChip显式添加必要的布局属性即可,修复后可运行代码如下:
from kivy.lang import Builder from kivymd.app import MDApp class MyApp(MDApp): def build(self): return Builder.load_string(KV) KV = ''' MDScreen: MDBoxLayout: pos_hint: {'center_y': 1, 'center_x': 1} adaptive_size: True spacing: "12dp" padding: "12dp" MDChip: text: 'Google' icon: 'google' check: True pos_hint: {"center_x": .5, "center_y": .5} ''' MyApp().run()
如果需要保留MDBoxLayout作为最外层容器,只需要在MDBoxLayout外层包裹一层MDScreen即可,不需要改动原有MDBoxLayout的内部布局逻辑。
内容的提问来源于stack exchange,提问作者Loh Boon How
相关产品推荐
相关产品推荐

