Gtk.CssProvider()基于ID的选择器在Gtk3中是如何工作的?

2022-02-27 00:00:00 python gtk3 gtk pygobject css

我断断续续地摆弄这个已经有几天了,但似乎就是不能理解可能存在的问题。

本质上,我试图使用CSS样式声明来设计Gtk3中的一些GTK小部件的样式,这并不复杂,只是尝试通过其id/名称来确定特定元素的目标。Gtk.CssProvider()的GTK文档说明

#widgetname { background-color: #333333; }

应该可以作为名称设置为"widgetname"的小部件的有效选择器,但是我似乎无法使其工作。我最初以为是CSS没有加载,但我可以针对顶级小部件,如下所示:

GtkWindow { background-color: #333; }

它会将样式应用到窗口,我可以看到背景颜色已更改。我尝试将该名称用作两个不同类型的小部件(GtkEventBox、GtkTextView、GtkStatusBar、GtkBox)的ID,但基于ID的选择器似乎不起作用。

以下是我如何加载CSS的简短片段:

css = Gtk.CssProvider()

# css.load_from_file(file)
css.load_from_data('''

GtkWindow {
    background-color: #333;
}

GtkEventBox {
    background-color: #333;
}

#statusbarwrap, #textview_event_wrap, #box1 {
     background-color: #333;
}

''')

style_context = self.get_style_context()
style_context.add_provider(
    css,
    Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

这里是GtkCssProviderhttps://developer.gnome.org/gtk3/3.7/GtkCssProvider.html

的文档

该页面上的示例24(只需向下滚动一两页)显示#ID选择器有效,我正在为Glade中的小部件设置名称。

如有任何帮助,我们将不胜感激。


解决方案

我们可以使用‘gtk_WIDGET_SET_NAME()’为此小部件指定名称(ID)。

win = Gtk.Window()
win.set_name('main_window')

则"#Main_Window"可以用作CSS3中的ID选择符:

#main_window {
  background-color: ...
}

如果您使用文本编辑器打开glade文件,您可以发现,widget的名称实际上标记为id,如下所示:

<object class="GtkWindow" id="window1">

请注意,小工具的名称不应包含*、#或>等特殊字符,这些字符是CSS语法的一部分。

相关文章