生成系统发育树时遇TypeError:setDotsPerMeterX参数类型错误
解决方法
1. 修复ete3库的类型错误
报错根源是ete3内部代码调用Qt的setDotsPerMeterX时传入了浮点数,但该方法要求整数参数。找到你的Python环境中ete3/treeview/main.py文件(路径为/home/xxx/.local/lib/python3.10/site-packages/ete3/treeview/main.py),定位到第754行附近的代码:
ii.setDotsPerMeterX(dpi / 0.0254) # Convert inches to meters ii.setDotsPerMeterY(dpi / 0.0254) # Convert inches to meters
把这两行修改为:
ii.setDotsPerMeterX(int(dpi / 0.0254)) # Convert inches to meters ii.setDotsPerMeterY(int(dpi / 0.0254)) # Convert inches to meters
2. 修正代码中的文件名不一致问题
你代码里Tree对象基于MK.fasta.treefile生成,但调用t.render时写的是rbcL_tree.png,和后续处理的MK_tree.png不匹配,会导致文件找不到。将这一行改成:
t.render("MK_tree.png", w=1000, h=800, units="px", tree_style=ts, dpi=int(dpi))
3. 移除多余的DPI调整代码
你已经用PIL完成了图片尺寸缩放和DPI设置,后面用QImage重复修改的代码完全多余,还可能引发额外问题,直接删除以下段落:
# Change the DPI of the image ii = QImage() ii.load("MK_tree.png") ii.setDotsPerMeterX(int(dpi / 0.0254)) # Convert inches to meters ii.setDotsPerMeterY(int(dpi / 0.0254)) # Convert inches to meters ii.save("MK_tree.png")
可选方案:不修改库代码
如果不想改动ete3的源码,可以直接不给t.render传dpi参数,只靠PIL来调整最终图片的DPI和尺寸。修改后的渲染调用:
t.render("MK_tree.png", w=1000, h=800, units="px", tree_style=ts)
内容的提问来源于stack exchange,提问作者shawn_smith_kaviedes
相关产品推荐
相关产品推荐

