2014-03-19 33 views
0

嗨,大家好,我從gtk開始,我需要在第一次點擊後禁用按鈕。GTK的解散按鈕

我有兩個按鈕,第一個按鈕使用USB開始數據輸入,第二個按鈕會終止進程。第一次點擊後,必須禁用數據感染按鈕。我正在使用一個名爲gtk_widget_set_sensitive(widget,FALSE | TRUE)的選項。在此之後,按鈕始終禁用,但我無法理解爲什麼?

這裏是我的代碼:

#include <gtk/gtk.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <stdio.h> 

pid_t pid, pid2; 
double a; 

static void button_clicked2 (GtkWidget *widget, gpointer data) 
{ 
    pid2=pid+1; 
    kill(pid, SIGTERM); 
    kill(pid2, SIGTERM); 
} 



int button_clicked(GtkWidget *widget, gpointer data) 
{ 
    g_print("clicked\n"); 
    pid = fork(); 
    //Here we begin te data transmission from our usb port... (the port must be initialized before we run the code) 
    if (pid == 0) 
{ 

     execlp("/bin/sh", "/bin/sh", "-c", " cat /dev/cu.usbmodem1421 -9600 > data1.txt", (char *)NULL); 

    printf("hello"); 

    } 
    return pid; 
} 


int main(int argc, char *argv[]) 
{ 
    GtkWidget *window; 
    GtkWidget *button; 
    GtkWidget *box1; 

    gtk_init (&argc, &argv); 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    box1 = gtk_hbox_new (FALSE, 0); 
    gtk_container_add (GTK_CONTAINER (window), box1); 


    gtk_container_set_border_width (GTK_CONTAINER (window), 10); 
    button = gtk_button_new_with_label("button 1"); 

    a=g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), (gpointer) "button"); 
    if(a==9) 
    { 
    gtk_widget_set_sensitive(widget, FALSE) 

    } 

    gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0); 
    gtk_widget_show (button); 


    button = gtk_button_new_with_label("button 2"); 

    gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0); 



    g_signal_connect (button, "clicked", G_CALLBACK (button_clicked2), (gpointer) "button 2"); 

    gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0); 



    gtk_widget_show(button); 
    gtk_widget_show(box1); 
    gtk_widget_show(window); 
    gtk_main(); 
    return 0; 
} 

我相信前點擊按鈕停止或者也許我不明白是怎麼函數調用工作。

回答

0

謝謝drahnr :)這是非常有用的:)。

最後,我修改了GTK教程頁面上的示例,並聲明瞭另一個按鈕。所以處理一個分離的按鈕和你的觀察是正確的答案。

#include <gtk/gtk.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <stdio.h> 




GtkWidget *window; 
GtkWidget *button; 
GtkWidget *button2; 
GtkWidget *box1; 
pid_t pid, pid2; 
double a; 

static void button_clicked2 (GtkWidget *widget, gpointer data) 
{ 

    g_print ("capture\n"); 
    g_print ("stop\n"); 
    pid2=pid+1; 
    kill(pid, SIGTERM); 
    kill(pid2, SIGTERM); 
} 

static void button_dissable (GtkWidget *widget, gpointer data) 
{ 

    gtk_widget_set_sensitive(button, FALSE); 
} 



static void button_clicked(GtkWidget *widget, gpointer data) 
{ 
    g_print("clicked\n"); 

    pid = fork(); 
    printf("hello"); 
    //Here we begin te data transmission from our usb port... (the port must be initialized before we run the code) 
    if (pid == 0) 
{ 

     execlp("/bin/sh", "/bin/sh", "-c", " cat /dev/cu.usbmodem1421 -9600 > data1.txt", (char *)NULL); 

    printf("hello"); 

    } 
} 





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


    gtk_init (&argc, &argv); 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    box1 = gtk_hbox_new (FALSE, 0); 
    gtk_container_add (GTK_CONTAINER (window), box1); 


    gtk_container_set_border_width (GTK_CONTAINER (window), 10); 
    button = gtk_button_new_with_label("button 1"); 

    g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), (gpointer) "button"); 
    g_signal_connect_swapped (button, "clicked",G_CALLBACK (button_dissable),button); 




    gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0); 
    gtk_widget_show (button); 


    button2 = gtk_button_new_with_label("button 2"); 

    gtk_box_pack_start (GTK_BOX(box1), button2, TRUE, TRUE, 0); 



    g_signal_connect (button2, "clicked", G_CALLBACK (button_clicked2), (gpointer) "button 2"); 

    gtk_box_pack_start(GTK_BOX (box1), button2, TRUE, TRUE, 0); 



    gtk_widget_show(button); 
    gtk_widget_show(button2); 
    gtk_widget_show(box1); 
    gtk_widget_show(window); 
    gtk_main(); 
    return 0; 
} 
0

使用gtk_widget_set_sensitive(button, FALSE)回調您連接到您的按鈕。


if(a==9) 
{ 
gtk_widget_set_sensitive(widget, FALSE) 

} 

沒有任何意義。閱讀manual