2017-08-28 42 views
-1
#include <gtk/gtk.h> 

GtkBuilder *builder; 
GtkWidget *window; 
GtkImage *image; 
GtkButton *but; 
char s[1000]; 

void on_button1_button_press_event(GtkWidget *but, gpointer data) 
{ 
    strcpy(s, "/home/linux/testing2.png"); 
    gtk_widget_queue_draw (image); 
} 

int main(void) 
{ 
    gtk_init(NULL, NULL); 
    builder = gtk_builder_new(); 
    gtk_builder_add_from_file(builder, "/home/linux/gui.xml", NULL); 
    window = (GtkWidget *) gtk_builder_get_object(builder, "window1"); 
    image = (GtkImage *) gtk_builder_get_object(builder, "image1"); 
    but = (GtkButton *) gtk_builder_get_object(builder, "button1"); 
    gtk_image_set_from_file(image, strcpy(s, "/home/linux/testing1.png")); 
    g_signal_connect(but, "clicked", G_CALLBACK(on_button1_button_press_event), NULL); 
    gtk_widget_show(window); 
    gtk_main(); 

    return 0; 
} 

當我點擊「button1」,「callback」函數調用,它更新字符串s然後我想gtk刷新「image1」與gtk_widget_queue_draw。但「image1」沒有改變。C更新GTK3的GUI元素

+1

請發佈代碼,沒有代碼無法幫助。具體顯示文件路徑更改後究竟調用了什麼,以及您嘗試執行的操作不起作用。原則上,您可以爲此調用[gtk_widget_queue_draw()](https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-queue-draw),但在實踐中,如果您設置了新圖像這個函數應該被自動調用。 –

+0

謝謝你的回覆。我發佈了我的示例代碼。 –

回答

0

gtk_widget_queue_draw()需要一個字符串與圖像的文件名。但它不會保留你傳遞的字符串。相反,小部件存儲整個加載的圖像。

所以你的s變量是沒用的,改變它什麼也不做。你應該做的,而不是在main()

gtk_image_set_from_file(image, "/home/linux/testing1.png"); 

,並在事件回調:

gtk_image_set_from_file(image, "/home/linux/testing2.png"); 

無需調用gtk_widget_queue_draw()因爲改變圖像自動做到這一點。

+0

謝謝你的解釋。但是有可能使用我的變量? –

+0

@ cuncon-當然你可以,這是你的變量,但是對於什麼?小部件不保留一個指向字符串的指針,並且你只使用文字字符串...那麼你爲什麼要使用它? – rodrigo

+0

看來我做了一件多餘的事情。啊,我想再問兩個問題。 1.我想在事件發生時顯示/隱藏整個窗口。我使用gtk_widget_show/hide()。這是對的嗎? 2.是否可以監視gtk_main循環中的文件? –