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

如何通过GtkAda CSS修改窗口背景色?编译正常但无效果

问题原因及修正方案

你的代码存在三个核心问题,导致CSS样式无法生效:


1. 错误使用Load_From_Data方法

Load_From_Data的作用是直接加载CSS文本内容,而非读取文件路径。你传入"style.css"相当于把这几个字符当作CSS代码解析,自然不会生效。应该使用Load_From_File来加载本地CSS文件。

2. 未绑定窗口的Style Context

你手动创建了一个独立的Gtk_Style_Context实例,但没有将它和目标窗口关联。正确做法是获取窗口控件本身的Style Context,而非新建无关实例。

3. CSS Provider优先级不足

添加Provider时传入的优先级0低于GTK默认样式的优先级,导致自定义CSS被覆盖。需使用GTK_STYLE_PROVIDER_PRIORITY_USER(默认值800)来确保自定义样式优先级更高。


修正后的代码

file.adb 调整后的style_window过程

procedure style_window (window : my_window) is
      Error : aliased GError;
      Success : Boolean;
      use Gtk.Style_Context; -- 引入优先级常量
   begin
      Gtk_New (window.Provider);
      -- 加载本地CSS文件,而非把文件名当数据
      Success := Load_From_File (window.Provider, "style.css", Error'Access);
      
      -- 错误处理:加载失败时打印错误信息
      if not Success then
         Put_Line ("CSS加载失败: " & Error.Message);
         Gerror_Free (Error);
         return;
      end if;

      -- 获取窗口自身的Style Context,而非新建
      window.Context := Window.Win.Get_Style_Context;
      -- 使用用户级优先级添加样式Provider
      Add_Provider (window.Context, + window.Provider, GTK_STYLE_PROVIDER_PRIORITY_USER);
end style_window;

额外注意事项

  • 确保style.css文件和编译后的可执行文件在同一目录,或使用绝对路径指定文件位置。
  • 如果窗口内包含容器控件(如GtkBox),可能需要同时给容器设置背景色(窗口背景可能被子控件覆盖),可修改CSS:
window, box {
    background-color: red;
}

内容的提问来源于stack exchange,提问作者Dimitri Emmanuel Zokoualouba M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:05:16