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