我一直无法弄清楚我在做什么错。我敢肯定这很简单,但是却让我逃脱了。即使在以下示例中,我也无法正常工作。我似乎无法在单个GtkWindow中将CSS样式应用于GtkEntry小部件。我只是想将输入框的背景设为红色。
我审阅的所有内容以及我看到的示例都如下所示,似乎没有其他人感到困惑。
这是我的Python:
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
builder = Gtk.Builder()
builder.add_from_file("entry.glade")
window = builder.get_object('window1')
window.connect('destroy', Gtk.main_quit)
css = "#red { background-image: linear-gradient(red); }"
provider = Gtk.CssProvider()
provider.load_from_data(css)
Gtk.StyleContext().add_provider_for_screen(Gdk.Screen.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
entry = builder.get_object('entry1')
entry_style_context = entry.get_style_context()
entry_style_context.add_class("red")
window.show_all()
Gtk.main()
这是Glade XML:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="3.0"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkEntry" id="entry1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">●</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
如果我将CSS设置为.entry { background-image: linear-gradient(red); }
,则可以使用,但是所有GtkEntry框都将变成红色(我不想要)。
我到底想念什么?
好吧,有了新的想法,再看一遍,我想我已经明白了。我不确定为什么它会这样工作,但是希望有人比我聪明。
出于任何原因,我都需要以点表示法指定小部件类型和类名,因为哈希表示法无法像CSS / HTML领域所期望的那样工作。
此操作NOT
起作用:css = "#foo { background-image: linear-gradient(red); }
此DOES
作品:css = "entry.foo { background-image: linear-gradient(red); }
我已经通过向Glade添加第二个输入框并执行以下操作来验证这一点:
css = """ .entry.red { background-image: linear-gradient(red); } .entry.blue { background-image: linear-gradient(blue); } """ provider = Gtk.CssProvider() provider.load_from_data(css) Gtk.StyleContext().add_provider_for_screen(Gdk.Screen.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) builder.get_object('entry1').get_style_context().add_class("red") builder.get_object('entry2').get_style_context().add_class("blue")
现在我有一个红色和一个蓝色输入框。
[在常规浏览器CSS中,#foo
指代ID为foo
的HTML元素(用id="foo"
设置),.foo
指代样式类的元素(例如class="foo"
设置) ,或多个类别,例如class="foo bar"
。]
问题