QTile WM自定义widget添加后无法加载报错原因咨询
问题根因
组件加载失败是因为你没有实现ThreadPoolText基类强制要求的poll()方法:base.ThreadPoolText属于定时轮询类的文本组件,Qtile会按照配置的update_interval间隔自动调用组件实例的poll()方法,拿到返回值作为要显示的内容。你的代码只定义了从未被调用的get_number()方法,没有重写基类的poll接口,运行时触发未实现方法的错误,直接导致组件加载失败。
另外你把自定义组件放到官方widget目录、修改官方包__init__.py的做法存在兼容问题:后续Qtile升级时会直接覆盖源码目录下的所有文件,你新增的组件、修改的映射配置都会丢失。
修复步骤
- 修正组件代码,实现
poll()接口
你可以直接把展示逻辑写在poll()方法里,也可以在poll()中调用其他自定义业务方法,修正后的可运行代码如下:
from libqtile.widget import base class test_w(base.ThreadPoolText): defaults = [("update_interval", 10, "Timer")] def __init__(self, **config): super().__init__(**config) self.add_defaults(test_w.defaults) def poll(self): output = 'aaa' return output
原代码中导入的re、subprocess没有任何调用,属于冗余代码,直接删除即可,不影响功能。
- (推荐)迁移自定义组件到用户配置目录,避免升级覆盖
不要修改Qtile安装目录下的任何源码文件,按以下方式存放自定义组件即可:- 在Qtile用户配置目录(默认路径
~/.config/qtile/)下新建目录,比如命名为my_widgets - 把修正后的
test_w.py放到my_widgets目录下,在同目录新建空文件__init__.py,将目录标识为Python包 - 在Qtile配置文件
config.py顶部添加导入语句:
- 在Qtile用户配置目录(默认路径
from my_widgets.test_w import test_w
后续在widget配置列表中直接调用test_w()即可,用法和官方组件完全一致,不需要修改官方包的映射配置。
- 校验运行环境
确认你运行的Qtile对应的Python环境和你修改的代码路径匹配,避免出现改了一处文件、实际加载另一处安装包的问题,保存配置后重启Qtile即可正常加载组件。
内容的提问来源于stack exchange,提问作者Lukas Tomek
相关产品推荐
相关产品推荐

