bonjour,
Suite à une problème dans la création d'un gui (un texte dans un bouton qui doit être modifié), j'ai essayé de reproduire +/- la même situation avec un petit programme que je vous met ci-après.
Après avoir poussé sur le bouton "start" le texte et la couleur devrait se modifier toute les seconde dans le bouton "Read".
la compilation du programme se fait avec la commande suivante
gcc -Wall boutonTest.c `pkg-config --cflags --libs gtk+-3.0`
J'ai toutes sortes de comportement avec ce petit programme, quelqu'un pourrait-il m'aider ?
je suis actuellemnt sur slackware 14 , mais le problème est identique avec mint 13
D'avance merci
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include "gtk/gtk.h"
#include <pthread.h>
static GtkWidget *window;
static GtkWidget *grid;
static GtkWidget *buttonRead;
static GtkWidget *buttonStart;
static GtkCssProvider *provider;
static GdkDisplay *display;
static GdkScreen *screen;
static int iret1 = 0;
static pthread_t thread1;
static int nb = 0;
static gboolean window_delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ){
gtk_widget_destroy(window);
gtk_main_quit ();
return TRUE;
}
void testRun(){
if (strcmp( gtk_button_get_label(GTK_BUTTON(buttonRead)),"Read") == 0){
gtk_button_set_label(GTK_BUTTON(buttonRead), "Write");
g_print(" new label is %s\n",gtk_button_get_label(GTK_BUTTON(buttonRead)));
provider = gtk_css_provider_new ();
gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider),
" GtkButton#buttonRead {\n"
" color: blue;\n"
"}\n", -1, NULL);
g_object_unref (provider);
}
else {
gtk_button_set_label(GTK_BUTTON(buttonRead), "Read");
g_print(" new label is %s\n",gtk_button_get_label(GTK_BUTTON(buttonRead)));
provider = gtk_css_provider_new ();
gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider),
" GtkButton#buttonRead {\n"
" color: red;\n"
"}\n", -1, NULL);
g_object_unref (provider);
}
}
static void *threadRun( ){
while(1){
sleep(1);
nb +=1;
g_print(" nb is %d\n", nb);
testRun();
}
return NULL;
}
static void callbackButtonStart( GtkWidget *widget, gpointer *data ){
iret1 = pthread_create( &thread1, NULL, threadRun, (void*) NULL);
}
static void initLayout(){
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_maximize (GTK_WINDOW (window));
gtk_window_set_title (GTK_WINDOW (window), "Test");
gtk_container_set_border_width (GTK_CONTAINER (window), 20);
g_signal_connect (window, "delete-event", G_CALLBACK (window_delete_event), NULL);
grid = gtk_grid_new ();
gtk_grid_set_column_spacing (GTK_GRID(grid),10);
gtk_grid_set_row_spacing (GTK_GRID(grid),10);
gtk_container_add (GTK_CONTAINER (window), grid);
buttonRead = gtk_button_new_with_label ("Read");
gtk_widget_set_name (GTK_WIDGET(buttonRead), "buttonRead");
gtk_widget_set_size_request(buttonRead, 90,50);
gtk_grid_attach(GTK_GRID(grid),buttonRead,1,0,1,1);
buttonStart = gtk_button_new_with_label ("Start");
gtk_widget_set_size_request(buttonStart, 90,50);
gtk_grid_attach(GTK_GRID(grid),buttonStart,2,0,1,1);
g_signal_connect (buttonStart, "clicked", G_CALLBACK (callbackButtonStart), "Read");
gtk_widget_show_all(window);
}
int main( int argc, char *argv[] ) {
gtk_init (&argc, &argv);
initLayout();
display = gdk_display_get_default ();
screen = gdk_display_get_default_screen (display);
printf("screen width is %d\n", gdk_screen_get_width(screen));
printf("screen height is %d\n\n", gdk_screen_get_height(screen));
gtk_main();
return 0;
}
Partager