GTK+3 更改标签中的文本颜色(树莓派)

GTK+3 更改标签中的文本颜色(树莓派)

我试图在运行时动态更改标签中文本的颜色。我尝试过应用 css 样式,我尝试过两种已弃用的方法,但都不起作用。能做到吗?如果不能,为什么这么简单的事情却做不到呢?

动态应用 css 样式部分有效:当我指定时

.pinkStyle {
    background-color: rgb(241, 135, 135);
    color: black;
}

在运行时我可以看到背景变成粉红色。但文字保持白色。

答案1

天啊。我正在记录这一点,这样就不会有人遭受我所遭受的痛苦。

如果您希望在运行时控制文本,则在任何情况下都不要使用 Glade 通过编辑属性设置前景色。如果这样做,则您已经永久设置了文本颜色,CSS 更改、pango 标记或像 gtk_widget_modify_fg 这样的弃用函数都无法在运行时触及。

您仍然可以使用 css 来更改标签的背景颜色,但为了获取文本自己的颜色和背景,我使用 gtk_label_set_markup 与

<span background=\"#0022ff\" foreground=\"#ff0044\">

成功了。从我在 Glade 中的所有标签中删除所有属性后。

GTK 是一场噩梦;我以前从未在 Linux 中遇到过任何让我向往 Windows 的东西,但这次却做到了。

答案2

GTK 很丑陋,部分原因是所有已弃用的东西。他们没有解决问题,而是修补问题。

无论如何,刚刚开始,它也在 raspberrypi.org 论坛上。 err 是 int,btcprice 和 oldprice 是浮点数,markup 和 errstr 是 gchar。

if (err == 0) {
  if (btcprice > oldprice)
    markup = g_strdup_printf("<span foreground='green'>%.2f</span>",btcprice);
  else
    markup = g_strdup_printf("<span foreground='red'>%.2f</span>",btcprice);
 } else {
   markup = g_strdup_printf("<span foreground='orange'>%s</span>",errstr);
 }
 gtk_label_set_markup(GTK_LABEL(pLabel),markup);
 g_free(markup);

如果价格下跌,文本颜色为红色;如果价格上涨,文本颜色为绿色;如果出现错误,文本颜色为橙色。 g_strdup_printf() 有点像 printf 或 snprintf,但它将浮点数转换为字符串,该字符串的颜色根据浮点数的值而变化。

答案3

这是上述代码的一个变体,它是一个回调函数,它响应标签上的点击(一个button_press_event信号)并根据标签的当前文本更改标签文本和颜色。它在树莓派上运行良好。多谢你们。

void on_block_01_pwr_button_press_event()
{   GtkWidget *label=GTK_WIDGET(block_01_pwr);
    const gchar * txt;
    char *format;
    gchar *markup;
    txt=gtk_label_get_text((GtkLabel *) block_01_pwr);
    int x=strcmp("pwr #1", txt);
    if(x==0)
    {   txt="pwr #2";
        format="<span foreground=\"#40c0c0\">%s</span>";
        markup=g_markup_printf_escaped(format,txt);
    }
    else 
    {   x=strcmp("pwr #2", txt);
        if(x==0){txt="pwr off";
        format="<span foreground=\"#999999\">%s</span>";
        markup=g_markup_printf_escaped(format,txt);
                }
        else 
        {txt="pwr #1";
    format="<span foreground=\"#000000\">%s</span>";
    markup=g_markup_printf_escaped(format,txt);
        }
    }
    gtk_label_set_text((GtkLabel *) block_01_pwr, txt);
    gtk_label_set_markup(GTK_LABEL (label), markup);
    g_free(markup);
// Add code here to set this block's power pack # (or off) and data array entry
}

相关内容