GTK+3 라벨의 텍스트 색상 변경(Raspberry Pi)

GTK+3 라벨의 텍스트 색상 변경(Raspberry Pi)

런타임 시 레이블의 텍스트 색상을 동적으로 변경하려고 합니다. 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
}

관련 정보