KivyMD Snackbar 文本属性失效的解决方案

kivymd 1.2.0 版本中 `snackbar` 组件移除了 `text` 初始化参数,导致按旧文档写法(如 `snackbar(text="message")`)报错;降级至 1.1.1 版本可恢复兼容用法。

在 KivyMD 1.2.0 中,Snackbar 的构造方式发生了重大变更:不再支持通过 text 参数直接初始化。这是由于该版本重构了 Snackbar 类,将其从一个简单文本提示组件升级为更灵活、可自定义内容的容器组件——其默认构造函数已移除 text 关键字参数,转而要求用户显式调用 open() 方法前,通过 Snackbar.text 属性赋值,或使用 Snackbar().open() 配合子控件(如 MDLabel)构建内容。

但需注意:官方文档(尤其是 1.2.0 对应文档)尚未完全同步更新此变更,仍大量引用旧版 text= 语法,造成开发者混淆。 实际测试表明,在 1.2.0 中执行以下代码会触发 TypeError:

from kivymd.uix.snackbar import Snackbar

# ❌ 错误:KivyMD 1.2.0 中此写法不被支持
snack = Snackbar(text="Hello World!")  # TypeError: __init__() got an unexpected keyword argument 'text'

✅ 正确做法(适配 1.2.0+):

from kivymd.uix.snackbar import Snackbar
from kivymd.uix.label import MDLabel

# 方式1:设置 text 属性后 open()
snack = Snackbar()
snack.text = "Operation completed successfully!"
snack.open()

# 方式2:自定义内容(推荐用于复杂提示)
content = MDLabel(
    text="Saved to clipboard",
    theme_text_color="Custom",
    text_color=(1, 1, 1, 1),
    size_hint_x=1.0,
)
snack = Snackbar()
snack.add_widget(content)
snack.open()

⚠️ 注意事项:

  • 若你依赖旧项目结构或教程(尤其基于 1.1.x 编写),最快速兼容方案是降级至 kivymd==1.1.1
    pip uninstall kivymd -y
    pip install kivymd==1.1.1
  • 降级后,Snackbar(text="...") 可正常工作,且行为与历史文档一致;
  • 但需权衡:1.1.1 不包含 1.2.0 的新特性(如主题适配增强、性能优化等),长期项目建议迁移到新版 API 并采用属性赋值方式;
  • 永远检查 kivymd.__version__ 以确认实际运行版本,避免因缓存或虚拟环境导致版本误判。

总结:问题本质是 KivyMD 主动弃用了 text 初始化参数,而非 Bug。开发者应根据所用版本选择对应 API —— 1.1.1 及以前用 Snackbar(text=...);1.2.0 及以后请改用 snack.text = ... + snack.open() 模式,以确保代码健壮性与未来兼容性。