为什么Gtk.TextView空行与行号错位、有文本的行却能正常对齐?
问题原因
- 两个
Gtk.TextView的行高控制属性未统一:pixels_above_lines(行顶部留白)、pixels_below_lines(行底部留白)、pixels_inside_wrap(折行内部留白)的默认值存在微小差异,每空行产生的1-2px高度差会随行数累加,最终形成明显错位。 - 内边距、边框样式不一致:两个TextView的默认margin、padding、border属性没有完全对齐,导致行高的计算基准不同。
- 滚动逻辑独立:两个独立TextView的垂直滚动偏移默认没有绑定,滚动时也会出现偏移差。
修复方案
代码层修改
在初始化两个TextView后添加以下配置:
# 需提前导入GObject from gi.repository import GObject # 统一两个TextView的行高、边距属性 for text_view in [self.t1, self.t2]: # 统一行间距 text_view.set_pixels_above_lines(0) text_view.set_pixels_below_lines(0) text_view.set_pixels_inside_wrap(0) # 统一四边内边距 text_view.set_left_margin(2) text_view.set_right_margin(2) text_view.set_top_margin(0) text_view.set_bottom_margin(0) # 禁用自动折行,避免折行导致的行数不一致 text_view.set_wrap_mode(Gtk.WrapMode.NONE) # 绑定垂直滚动偏移,两个组件滚动完全同步 self.t2.get_vadjustment().bind_property( "value", self.t1.get_vadjustment(), "value", GObject.BindingFlags.SYNC_CREATE )
CSS层修改
调整theme.css中的textview规则,明确统一字体和边距:
textview { font-family: "Consolas", "Monaco", monospace; font-size: 14px; margin: 0; padding: 0; border: none; }
可选优化方案
可以直接使用GTK官方的代码编辑组件GtkSource.View,内置行号显示、语法高亮等能力,不需要自行实现双TextView同步逻辑,避免类似对齐问题。
内容的提问来源于stack exchange,提问作者Sylvester is on codidact.com
相关产品推荐
相关产品推荐

