entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

¿obtener los "nietos" de un GtkBox (GTK 3) ?

Estoy creando un programa que genere sentencias SQL con GTK y C, pero me he topado con algo que creo que es una tontería y aún no lo soluciono:

En la interfaz gráfica tengo un GtkBox que contiene otros contenedores (GtkPaned, GtkBox, GtkBox, GtkBox y GtkScrolledWindow). Estos últimos contienen los widgets con los cuales hago la "magia" en las funciones. Los widgets que necesito son; un GtkTextEntry, un GtkRadioButton y un GtkTextView.

Lo que tengo es lo siguiente:

void generar_sentencia (GtkContainer *caja_principal) {

GList *hijos = gtk_container_get_children (caja_principal);

GtkContainer *panel = g_list_nth_data (hijos, 1);

GtkEntry *entrada = g_list_nth_data (gtk_container_get_children (panel), 1);

GtkEntryBuffer *entrada_buffer = gtk_entry_get_buffer (entrada);

GtkRadioButton *empleos = g_list_nth_data (gtk_container_get_children (g_list_nth_data (gtk_container_get_children (caja_principal), 1)), 1);

GtkRadioButton *productos = g_list_nth_data (gtk_container_get_children (g_list_nth_data (gtk_container_get_children (caja_principal), 1)), 2);

GtkRadioButton *servicios = g_list_nth_data (gtk_container_get_children (g_list_nth_data (gtk_container_get_children (caja_principal), 1)), 3);

GtkTextBuffer *texto_buffer = gtk_text_view_get_buffer (g_list_nth_data (gtk_container_get_children (g_list_nth_data (gtk_container_get_children (caja_principal), 3)), 0));

const gchar *separador = ",";

const gchar *espacio = " ";

gchar **nombres = g_strsplit (gtk_entry_buffer_get_text (entrada_buffer), separador, 0);

gchar *campos_cotejamiento;

gchar *sentencia_sql;

GtkTextIter iter_final;

int i = 0;

if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (empleos))) {

    campos_cotejamiento = "(Id int(30) not null auto_increment primary key, Título varchar(100), Descripción varchar(300), Categoría varchar(50), Salario int(12), Modalidad varchar(50), Comuna varchar(50), Nombre varchar(200), Correo_electrónico varchar(100), Teléfono int(8), Fecha timestamp, Ip varchar(12)) character set latin1 collate latin1_spanish_ci;";

}

if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (productos))) {

    campos_cotejamiento = "(Id int(30) not null auto_increment primary key, Título varchar(100), Descripción varchar(300), Precio int(12), Nombre varchar(200), Correo_electrónico varchar(100), Teléfono int(8), Fecha timestamp, Ip varchar(12)) character set latin1 collate latin1_spanish_ci;";

}

if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (servicios))) {

    campos_cotejamiento = "(Id int(30) not null auto_increment primary key, Título varchar(100), Descripción varchar(300), Categoría varchar(50), Precio int(12), Nombre varchar(200), Correo_electrónico varchar(100), Teléfono int(8), Fecha timestamp, Ip varchar(12)) character set latin1 collate latin1_spanish_ci;";

}

while (nombres[i] != NULL) {

    sentencia_sql = g_strjoin (espacio, g_strchug (nombres[i]), campos_cotejamiento, NULL);

    gtk_text_buffer_get_end_iter (texto_buffer, &iter_final);

    gtk_text_buffer_insert (texto_buffer, &iter_final, sentencia_sql, -1);

    i++;

}

}

Cuando lo ejecuto en la terminal me aparece lo siguiente:

EXECUTING:
/home/pablo/creasent-sql/Debug/src/creasent_sql

(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_entry_get_buffer: assertion `GTK_IS_ENTRY (entry)' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_text_view_get_buffer: assertion `GTK_IS_TEXT_VIEW (text_view)' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_entry_buffer_get_text: assertion `GTK_IS_ENTRY_BUFFER (buffer)' failed

(creasent_sql:3267): GLib-CRITICAL **: g_strsplit: assertion `string != NULL' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_toggle_button_get_active: assertion `GTK_IS_TOGGLE_BUTTON (toggle_button)' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_toggle_button_get_active: assertion `GTK_IS_TOGGLE_BUTTON (toggle_button)' failed

(creasent_sql:3267): Gtk-CRITICAL **: gtk_toggle_button_get_active: assertion `GTK_IS_TOGGLE_BUTTON (toggle_button)' failed


Program has been terminated receiving signal 11 (Segmentation fault)
Press the Enter key to close this terminal ...

No entiendo a que se refieren estos errores, pues no veo que esté mezclando "peras con manzanas".

No sé si me puedan ayudar, ya que es una pregunta bien específica, de antemano gracias.

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola Quijote,

para empezar, no tengo ni idea de la raíz del problema. Estás avisado!

Parte del mismo está en la relación de contenedor / continente de cada widget según como lo creaste en Glade y hay que ver el XML resultante para ver quién está dentro de quien.

Lo que yo haría en este caso, sería debuggear agregando una línea de código entre cada asignación para conocer de qué clase son y qué nombre tienen los elementos que obtenés del puntero a cajaPrincipal, ya que estás en el código asumiendo que son de un tipo determinado, pero alguno es de un tipo distinto a que creés (posiblemente porque hayas entrado al nodo equivocado de la definición de la GUI) y ahí estás, sin querer, mezclando las peras con las manzanas.

En tu caso, vería el nombre y el tipo de:

*caja_principal
*panel
*entrada
*entrada_buffer
*empleos
*productos
*servicios
*texto_buffer

porque alguno o varios no son del tipo que esperás que sean.

Luego nos cuentas para ver cómo sigue todo!

0voto

quijote108 comentado

Gracias Leonardo. Estuve explorando el GList *hijos y me encontré con la sopresa de que sólo tiene un elemento. El único elemento que contiene es un GtkLabel. No sé si entiendo mal el concepto de los GList ya que revisé el xml de glade y todo está en orden. Según lo que he leído, la función gtk_container_get_children debería entregarte punteros hacia todos los hijos de un container que no sean internos, es decir, que no sean definidos por el usuario y son parte de la implementación de la interfaz (algo "automático"). Ahora, ¿porque no me entrega los demás punteros para definir las variables que usa mi función?, no lo sé. Seguiré revisando y leyendo en internet. Cuando tenga la respuesta lo escribo aquí. Cualquier sugerencia es bienvenida.

1voto

quijote108 comentado

El problema es que por defecto se pasan 2 argumentos a la función callback. El primero es el widget donde se origina la señal y el segundo es el dato entregado por el usuario. Yo estaba asumiendo que sólo se pasaba el segundo argumento. Ese era todo el problema.

0voto

Leonardo-Tadei comentado

Me alegra que con el debbugin propuesto y supongo que algunas horas de manuales, hayas podido solucionar el problema.

Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta