Cambiar el color de GtkButton cuando se cambia GtkWindow

Estoy probando un programa Gtk de muestra simple y usando GtkTable para alinear mis widgets.

Mi diseño debería ser:

El fondo de la ventana es negro. Los botones deben ser blancos mientras que el texto de los botones debe ser negro. Todas las etiquetas deben ser blancas para que puedan verse contra el fondo negro de la ventana.

Teniendo esto en cuenta. Esto es lo que he hecho hasta ahora.

Código:

#include <gtk/gtk.h>
#include <glib.h>
#include <stdlib.h>     /* for atoi() and exit() */
#include <stdio.h>      /* standard in and output*/


typedef struct cmd_widgets{
    GtkWidget *button1;
    GtkWidget *combo;
    GtkWidget *label;

}my_cmd_widgets;

static gboolean close_application( GtkWidget *widget, GdkEvent  *event, gpointer   data )
{
  gtk_main_quit ();
  return FALSE;
}

static void UpdateChoice( GtkWidget *widget, gpointer data)
{
    my_cmd_widgets *widgrp;
    widgrp = (my_cmd_widgets *)data;
    gchar *text =  gtk_combo_box_get_active_text(GTK_COMBO_BOX(widgrp->combo));
    GString *val = g_string_new("You have chosen :  ");
    g_string_append(val, text);
    gtk_label_set_text(GTK_LABEL(widgrp->label), val->str);
    g_free(text);
}


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

  GtkWidget *window;
  GtkWidget *table;

  GtkWidget *label1;
  GtkWidget *label2;
  GtkStyle  *style;

  GtkWidget *align;

  my_cmd_widgets grp_widgets;
  GtkWidget *image;

  gtk_init(&argc, &argv);
  gtk_rc_parse("fonts.rc");

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_title(GTK_WINDOW(window), "Tour App");
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);

  table = gtk_table_new(7, 1, FALSE);
  gtk_container_add(GTK_CONTAINER(window), table);


  label1 = gtk_label_new("Our Tour Package Offers");
  align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
  gtk_container_add(GTK_CONTAINER(align), label1);
  gtk_table_attach(GTK_TABLE(table), align, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 10);


  label2 = gtk_label_new("Select City: ");
  align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
  gtk_container_add(GTK_CONTAINER(align), label2);
  gtk_table_attach(GTK_TABLE(table), align,0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
  gtk_widget_show(align);
  grp_widgets.combo = gtk_combo_box_new_text();
  gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "Paris");
  gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "London");
  gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "Tokyo");
  gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "New York");

  /* Creates a new button1. */

   grp_widgets.button1 = gtk_button_new_with_label ("See Itinerary");

   grp_widgets.label = gtk_label_new("");
   align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
   gtk_container_add(GTK_CONTAINER(align), grp_widgets.label);
   gtk_table_attach(GTK_TABLE(table), align,0, 1, 5, 6, GTK_FILL, GTK_FILL, 0, 0);
   gtk_widget_show(align);


  image = gtk_image_new ();
  gtk_image_set_from_file (GTK_IMAGE(image), "Images/olympics_logo.gif");

  //column 1
  gtk_table_attach(GTK_TABLE(table), image, 0, 1, 0, 1,
      GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 0, 0);
  gtk_table_attach(GTK_TABLE(table), grp_widgets.combo, 0, 1, 3, 4,
      GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 0, 15);
  gtk_table_attach(GTK_TABLE(table), grp_widgets.button1, 0, 1, 4, 5,
      GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 15);



  g_signal_connect(window, "destroy",G_CALLBACK(gtk_main_quit), NULL);
  g_signal_connect (window,"delete-event",G_CALLBACK (close_application), NULL);
  g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));
  g_signal_connect (G_OBJECT(grp_widgets.button1), "clicked", G_CALLBACK (UpdateChoice), (gpointer)&grp_widgets);


  gtk_widget_show(table);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

Aquí está el archivo rc con propiedades para MESA Y VENTANA:

style "window"
{
  font_name = "fixed 12"
  bg[NORMAL] = { 0.0, 0.0, 0.0 }
}
style "table"
{
  bg[NORMAL] = { 1.0, 1.0, 1.0 }
  fg[NORMAL] = { 1.0, 1.0, 1.0 }
}

style "container" {
        font_name = "bold 12"
        xthickness = 10
        ythickness = 10
        bg[NORMAL] = { 1.0, 1.0, 1.0 }
        fg[NORMAL] = { 1.0, 1.0,1.0 }          
}

style "button" {
        font_name = "bold 12"
        xthickness = 10
        ythickness = 10 
        #bg[NORMAL] = { 0.0, 0.0, 0.0 }   
        fg[NORMAL] = { 0.0, 0.0, 0.0 }  
}

#widget_class "*GtkButton*" style "button"
widget_class "GtkWindow" style "window"
widget_class "*GtkTable*" style "table"

El problema en el código anterior es que el texto (etiqueta) del botón permanece en blanco cuando cambio el fg a blanco en los estilos de tabla o ventana. Incluso después de cambiar el fg a negro (como se muestra a continuación), el texto de la etiqueta en mi botón permanece en blanco. Además, ¿cómo puedo estirar la imagen y todos los widgets en la ventana para que cada vez que cambie el tamaño de mi ventana, todos los widgets cambien de tamaño para adaptarse a la pantalla también?

preguntado el 23 de mayo de 12 a las 16:05

¿Y qué resultados estás obteniendo, en otras palabras, Cuál es tu pregunta? -

¡UPS! ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Dios mío :) Gracias relajarse -

1 Respuestas

Todas las etiquetas deben ser blancas para que puedan verse contra el fondo negro de la ventana.

Según lo que he encontrado en línea:

GtkLabel Widget es uno de los pocos widgets de GTK+ que no crean su propia ventana para mostrarse. Esto significa que para establecer el color de fondo para un widget GtkLabel, debe cambiar el color de fondo de su elemento principal.

Entonces, en ese caso, para un ejemplo simple, empaqueté solo una de las etiquetas en un GtkEventBox.
Pieza de código:

GtkWidget *eventBox;
...
eventBox = gtk_event_box_new();
  
label1 = gtk_label_new("Our Tour Package Offers");
gtk_container_add(GTK_CONTAINER(eventBox), label1);
align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0);
gtk_container_add(GTK_CONTAINER(align), eventBox);
...

archivo rc simplificado:

style "window"
{
  font_name = "fixed 12"
  bg[NORMAL] = { 0.0, 0.0, 0.0 }
}

style "label"{
  bg[NORMAL] = { 1.0, 1.0, 1.0 }
}

widget_class "GtkWindow" style "window"
widget_class "*GtkAlignment*GtkEventBox*" style "label"

y resultado:
enter image description here

Respondido el 20 de junio de 20 a las 10:06

Gracias fabregaszy. De hecho, quiero que el texto de las etiquetas sea blanco. Con solo el color de primer plano establecido en blanco en el estilo de tabla, el texto de las etiquetas se muestra en blanco. Sin embargo, la etiqueta con el texto "Ver itinerario" en el botón también se vuelve blanca. He editado mi publicación. Puedes probar el código anterior. - user907810

En su archivo rc, debe intentar hacer coincidir la etiqueta que desea que afecte su archivo rc con la mayor precisión posible. A veces, '*' puede ser complicado porque puede afectar a GtkLabel, que es el elemento secundario de GtkButton (creado por gtk_button_new_with_label). Yo también soy novato en GTK, espero que te ayude :D - fabregaszy

Con widget_class "GtkButton.GtkLabel" estilo "etiqueta" resolví el problema. Gracias por la ayuda. - user907810

ok, son 8 años... pero el tema de mi sistema anula el archivo rc... - Chaqueta

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.