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

Gtk.CssProvider设置等宽字体仅部分生效,显示'ff'时异常求助

问题:GTK TextView显示特定文本时等宽字体失效

我用C语言写了一个GTK程序,通过TextView显示数据包内容,CSS里指定了Courier等宽字体,但显示"ff"时字体变成了比例字体,希望始终保持等宽效果(类似xxd输出)。

相关代码片段如下:

创建窗口和TextView的代码

// Create new window to display unfragmented packet.
window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable (GTK_WINDOW (window1), TRUE);
gtk_window_set_position (GTK_WINDOW (window1), GTK_WIN_POS_NONE);
gtk_window_set_title (GTK_WINDOW (window1), title[0]);
gtk_window_set_default_size (GTK_WINDOW (window1), 1000, 200);
gtk_container_set_border_width (GTK_CONTAINER (window1), 1);

// Create a textview object to display unfragmented packet.
textview1 = gtk_text_view_new ();
buffer1 = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview1));
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview1), TRUE);
provider = gtk_css_provider_new ();
gtk_css_provider_load_from_path (provider, "./packet.css", NULL);
context = gtk_widget_get_style_context (textview1);
gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

填充文本并显示的代码

// Put the text into the buffer.
gtk_text_buffer_set_text (buffer1, nofrag_string, -1);

// Add scrolled window and textview to new window1 and display unfragmented packet.
scrolled_win1 = gtk_scrolled_window_new (NULL, NULL);
gtk_container_add (GTK_CONTAINER (scrolled_win1), textview1);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win1),
                                GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);

gtk_container_add (GTK_CONTAINER (window1), scrolled_win1);
gtk_widget_show_all (window1);

对应的packet.css

textview {
  font-family: Courier;
}

解决方案

可以从以下几个方面修复这个问题:

  • 指定更可靠的等宽字体族
    系统中的Courier可能不是严格等宽,或者存在变体。改用通用等宽族+多个备选字体,确保系统能找到合适的严格等宽字体:

    textview {
      font-family: "Courier New", Courier, monospace;
    }
    

    monospace是CSS通用字体族,系统会自动选择默认的等宽字体,兼容性最好。

  • 禁用字体连字
    "ff"变成比例字体很可能是因为字体启用了连字(ligature),把两个f合并成一个宽字符。在CSS中禁用连字:

    textview {
      font-family: "Courier New", Courier, monospace;
      font-variant-ligatures: none;
      /* 兼容旧版本的写法 */
      font-feature-settings: "liga" 0, "clig" 0;
    }
    
  • 检查文本缓冲区的格式
    确保nofrag_string中没有混入特殊格式标签,或者代码中没有给部分文本设置非等宽的字体属性。如果使用了gtk_text_buffer_insert_with_tags之类的方法,要确保所有文本都应用了统一的等宽样式。


内容的提问来源于stack exchange,提问作者Dave Buchan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:40:49