Python GTK3 中的多个 CSS 提供程序

问题描述 投票:0回答:1

我读过很多关于在 Python 中的 GTK3 中使用 CSS 的文章,但我似乎从未真正找到任何有关以编程方式更改样式的内容。通常有一个大的三引号字符串,其中包含所有 CSS 定义。但是如果我想在代码中以编程方式更改单一样式怎么办?如果我使用该单一样式修改提供程序 (load_from_data),所有其他样式都会丢失(即它们恢复为默认样式)。

我找到了一种有效的方法,但我想获得一些建议来确定这是否是最好的方法。我发现我可以创建并添加 another 提供程序,并且我可以给它更高的优先级,因此其中的任何样式都会覆盖大三引号 CSS 字符串中的样式。此处讨论优先级:https://lazka.github.io/pgi-docs/Gtk-3.0/classes/StyleContext.html#Gtk.StyleContext.add_provider_for_screen,不同优先级的解释如下:https:// /lazka.github.io/pgi-docs/Gtk-3.0/constants.html#Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION.

这里有一些示例代码来演示。是的,我意识到这是非常奇怪的代码...创建一个窗口,其中包含几个具有奇怪背景颜色的条目。如果更改“第二个”输入字段中的文本,则两个条目的背景也会发生变化。但重点是,脚本中的某些点我们想要动态更改某些样式(例如,已执行字体选择器来选择新的文本字体),这似乎为我们提供了一种执行此操作的机制。您将需要使用本文中找到的 .glade 文件来运行此代码:Issues with some CSS Selectors when using Python GTK3 #!/usr/bin/env python3 from gi.repository import Gtk, Gdk CSS = b""" window { background-color: yellow; } entry { background-color: green; } """ def text_changed(self, provider): text = self.get_text() print(text) newcss = "entry {background-color: red}" provider.load_from_data(bytes(newcss.encode())) myBuilder = Gtk.Builder() myBuilder.add_from_file("pygtk3test.glade") window = myBuilder.get_object("mainWindow") #objects = myBuilder.get_objects() label2 = myBuilder.get_object("label2") entry2 = myBuilder.get_object("entry2") # set up the global CSS provider style_provider = Gtk.CssProvider() style_provider.load_from_data(CSS) Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) user_provider = Gtk.CssProvider() user_provider.load_from_data(bytes("".encode())) Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), user_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) entry2.connect("changed", text_changed, user_provider) window.connect("delete-event", Gtk.main_quit) window.show_all() Gtk.main()

我愿意接受任何有关如何做得更好的建议。谢谢。

python css gtk3
1个回答
0
投票
gtk_style_context_add_provider_for_screen

,除了使用 CSS 定义 CSS 类。然后使用添加和删除类函数来来回切换您的小部件。 (下面是 C 代码,不是 C++)。

gtk_style_context_add_class (
   gtk_widget_get_style_context (widget), class);

gtk_style_context_remove_class (
   gtk_widget_get_style_context (widget), class);

我在一个文件中定义了一些静态 CSS,我在其中读到了它,我附加了所有动态 CSS 配置并使用 
gtk_style_context_add_provider_for_screen

来设置它。从此以后,只需要添加和删除类即可。

    

© www.soinside.com 2019 - 2024. All rights reserved.