即时更改GTK + 3更改标签的颜色不会更改文本背景

时间:2018-07-20 12:19:32

标签: css label gtk background-color

我是Gtk + 3的新手。我习惯于使用Visual Basic设计GUI。我对Gtk遇到的所有麻烦感到非常沮丧,但我想我已经研究并解决了我所有的问题,只有一个。这是树莓派上最新的Gtk + 3,我用Glade整理了版面。目的是让各个标签在软件控制下更改背景颜色和文本颜色。请注意,这严格来说是一种显示-没有输入控件,只有网格,布局框和标签。

我几乎可以正常工作了。当我的代码运行时,它交替应用和删除给定的CSS样式。我可以看到结果。但是标签具有3个单独的有趣属性:标签本身的背景颜色,文本的背景颜色(文本未填充整个标签)以及文本本身的颜色。我的代码成功地更改了标签的背景和文本的颜色,但没有更改文本的背景。在所有情况下,我都需要文本背景以匹配标签背景。一种方法是使文本背景颜色始终透明。同时更改两种背景颜色将是另一种选择。我该怎么办?

这是感兴趣的CSS:

* {
    background-color: black;
    color: whitesmoke;
}
.redStyle {
    background-color: rgb(182, 8, 8);
    color: whitesmoke;
}
.pinkStyle {
    background-color: rgb(241, 135, 135);
    color: black;
}

测试代码从Gtk的空闲机制中交替调用这两个函数。

gboolean flashing1(void*)
{
    GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object (builder, "labObsession"));

    GtkStyleContext *context = gtk_widget_get_style_context(widget);
    gtk_style_context_add_class(context,"pinkStyle");

    gtk_widget_queue_draw(widget);
    return false;
}

gboolean flashing2(void*)
{
    GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object (builder, "labObsession"));

    GtkStyleContext *context = gtk_widget_get_style_context(widget);
    gtk_style_context_remove_class(context,"pinkStyle");

    gtk_widget_queue_draw(widget);
    return false;
}

请帮助。到现在为止,谷歌搜索了两两天。我知道有一个折旧的覆盖函数可能会执行此操作,但我正努力避免这种情况。

要获得额外的信用,为什么我会看到 **(a.out:26251):警告**:检索可访问性总线地址时出错:org.freedesktop.DBus.Error.ServiceUnknown:任何服务文件均未提供名称org.a11y.Bus。 每当我开始?

这是测试应用程序的完整代码:

#include <gtk/gtk.h>

#include <thread>
#include <iostream>

static GtkBuilder      *builder; 

gboolean flashing1(void*)
{
    GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object (builder, "labObsession"));

    GtkStyleContext *context = gtk_widget_get_style_context(widget);
    gtk_style_context_add_class(context,"pinkStyle");

    gtk_widget_queue_draw(widget);
    return false;
}

gboolean flashing2(void*)
{
    GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object (builder, "labObsession"));

    GtkStyleContext *context = gtk_widget_get_style_context(widget);
    gtk_style_context_remove_class(context,"pinkStyle");

    gtk_widget_queue_draw(widget);
    return false;
}

void flashingTh(GtkWidget*) //may need this param someday
{
    for (;;)
    {
           usleep(50 * 1000);
        gdk_threads_add_idle (flashing1, nullptr);
       usleep(90 * 1000);
        gdk_threads_add_idle (flashing2, nullptr);
    }
}

int main(int argc, char *argv[])
{
    GtkWidget       *window;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "randomness/Lachesis.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
    gtk_builder_connect_signals(builder, NULL);

    //    g_object_unref(builder); //keep. needed to find things. Ugh.
    //GtkStyleContext *context;

    GtkCssProvider *provider = gtk_css_provider_new (); 
    gtk_css_provider_load_from_path (provider,
                                 "randomness/lachesis.css",
                                 nullptr);
    gtk_style_context_add_provider_for_screen (gdk_screen_get_default(),
                                    GTK_STYLE_PROVIDER(provider),
                                    GTK_STYLE_PROVIDER_PRIORITY_USER);


    gtk_widget_show(window);  
    std::thread(flashingTh, window).detach();              
    gtk_main();

    return 0;
}

 //not hooked up yet, signals can wait until painting works
// called when window is closed
void on_window_main_destroy()
{
    gtk_main_quit();
}

这是.glade的片段:

<interface>
  <requires lib="gtk+" version="3.0"/>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="halign">start</property>
    <property name="title" translatable="yes">Lachesis</property>
    <property name="window_position">center-always</property>
    <property name="hide_titlebar_when_maximized">True</property>
    <child>
      <object class="GtkGrid" id="topGrid">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="halign">start</property>
        <property name="row_spacing">2</property>
        <property name="column_spacing">2</property>
        <child>
          <object class="GtkBox" id="box1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="orientation">vertical</property>
            <child>
              <object class="GtkLabel" id="labObsession">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">Controller: unknown</property>
                <attributes>
                  <attribute name="background" value="#000000000000"/>
                </attributes>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">0</property>
              </packing>
            </child>

1 个答案:

答案 0 :(得分:1)

事实证明,如果通过Glade定义标签并以这种方式设置属性,则您在代码中无法执行的任何操作(至少没有明显的改变)将更改文本的背景或前景色。不是CSS,不是折旧的函数,不是pango标记。我没有研究原因,我也不在乎-底线是,如果要对这些属性进行后续控制,请不要在林间中编辑属性。清除属性后,便可以使用标记字符串来控制代码中文本的颜色和背景。