You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:24:03