gtk+ Funktionen



  • Hallo,

    ich habe dieses Programm geschrieben.

    Wenn ich auf Apply drücke bleibt der Button blau. Wie kann ich es einstellen dass er wieder die graue Farbe bekommt.

    Wenn ich etwas ins Textfeld schreibe und auf OK drücke bleibt der Text noch im Entry. Wie kann ich einstellen wenn ich auf OK drücke dass das Textfeld gelöscht wird.

    #include <gtk/gtk.h>
    
     GtkWidget *entry;
    
    static void on_destroy (GtkWidget *widget, gpointer data)
    {
      gtk_main_quit();
    }
    
    static void text_entry (GtkWidget *widget, gpointer data)
    {
    	const gchar *text;
    
    	text= gtk_entry_get_text (GTK_ENTRY(entry));
      printf ("%s\n", text);
    }
    
    int main (int argc, char *argv[])
    {
      GtkWidget *window;
      GtkWidget *vbox;
      GtkWidget *label;
      GtkWidget *hbox1;
      GtkWidget *namelabel;
    
      GtkWidget *hbox2;
      GtkWidget *closebutton;
      GtkWidget *okbutton;
      GtkWidget *gender;
      GtkWidget *female;
      GtkWidget *male;
    
      gtk_init (&argc, &argv);
    
      window= gtk_window_new (GTK_WINDOW_TOPLEVEL);
    
      gtk_container_set_border_width (GTK_CONTAINER (window), 30);
    
      gtk_window_set_title (GTK_WINDOW (window),"Greeter");
    
      gtk_window_set_default_size (GTK_WINDOW (window), 500, 250);
    
      g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (on_destroy), NULL);
    
    //gtk_window_set_resizable(GTK_WINDOW (window), FALSE);
    
      vbox= gtk_vbox_new (TRUE, 0);
      gtk_container_add (GTK_CONTAINER (window), vbox);
    
      label= gtk_label_new ("Hello...");
      gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
    
      hbox1= gtk_hbox_new (TRUE, 0);
      gtk_box_pack_start (GTK_BOX (vbox), hbox1, TRUE, TRUE, 0);
    
      namelabel= gtk_label_new ("Enter your Name:");
      gtk_box_pack_start (GTK_BOX (hbox1), namelabel, TRUE, TRUE, 0);
    
      entry= gtk_entry_new();
      gtk_box_pack_start (GTK_BOX (hbox1), entry, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (entry), "activate", G_CALLBACK (text_entry), NULL);
    
      hbox2= gtk_hbox_new (TRUE, 30);
      gtk_box_pack_start (GTK_BOX (vbox), hbox2, TRUE, TRUE, 0);
    
      closebutton= gtk_button_new_from_stock ("gtk-close");
      gtk_box_pack_start (GTK_BOX (hbox2), closebutton, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (closebutton), "clicked", G_CALLBACK (on_destroy), NULL);
    
      okbutton= gtk_button_new_from_stock ("gtk-apply");
      gtk_box_pack_start (GTK_BOX (hbox2), okbutton, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (okbutton), "clicked", G_CALLBACK (text_entry), NULL);
    
      gtk_widget_show_all (window);
    
      gtk_main();
    
      return 0;
    }
    

    MfG



  • Nach:

    text= gtk_entry_get_text (GTK_ENTRY(entry));
    

    einfach:

    gtk_entry_set_text (GTK_ENTRY(entry), "");
    

    🙂



  • Danke für die Antwort. Hätte ich selber drauf kommen können, dachte aber es gibt eine extra Funktion dafür.

    Wenn ich auf den OK-Button drücke bleibt er blau, weißt du noch wie ich es einstellen kann dass er die normale Farbe bekommt.

    Ich hätte auch noch gerne wenn ich den OK Oder CLOSED Button clicke dass sie während des drückens grün oder rot gefärbt werden.

    Geht das mit der "GtkColorButton" Funktion.



  • forumbenutzer schrieb:

    Wenn ich auf den OK-Button drücke bleibt er blau, weißt du noch wie ich es einstellen kann dass er die normale Farbe bekommt.

    Das ist das normale Verhalten, wenn er den Fokus bekommt. Du könntest ja versuchen dem Textfeld den Fokus zurückzugeben.

    forumbenutzer schrieb:

    Ich hätte auch noch gerne wenn ich den OK Oder CLOSED Button clicke dass sie während des drückens grün oder rot gefärbt werden.

    Das ist eigentlich eine Einstellung des Themes und sollte nicht manuell verändert werden.



  • Hallo

    Ich habe eine hbox wo ich 3 Radiobuttons nebeneinander habe.

    Kann ich in dieser hbox unter den ersten Radiobutton einen Button hinstellen oder brauche ich da eine neue hbox.

    Hoffe es ist verständlich, wenn nicht dann bitte mitteilen und ich versuche es anders zu formulieren.

    MfG



  • Hier ist der Code

    hbox3= gtk_hbox_new (TRUE, 0);
      gtk_box_pack_start (GTK_BOX (vbox), hbox3, TRUE, TRUE, 0);
    
      radio1= gtk_radio_button_new_with_label (NULL, "female");
      gtk_box_pack_start (GTK_BOX (hbox3), radio1, FALSE, FALSE, 0);
    
      radio2= gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio1), "male");
      gtk_box_pack_start (GTK_BOX (hbox3), radio2, FALSE, FALSE, 0);
    
      radio3= gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio1), "nothing");
      gtk_box_pack_start (GTK_BOX (hbox3), radio3, FALSE, FALSE, 0);
    

    MfG



  • Du brauchst eine zusätzliche VBox:

    -------------------------------
    | Ratio 1 |         |         |
    |---------| Ratio 2 | Ratio 3 |
    | Button  |         |         |
    -------------------------------
    

    Ratio 2 und 3 müsstest du dann aber noch irgendwie vertikal nach oben bekommen. Alternativ könntest du auch mal eine Tabelle versuchen:

    -------------------------------
    | Ratio 1 | Ratio 2 | Ratio 3 |
    |---------|---------|---------|
    | Button  |         |         |
    -------------------------------
    


  • Hallo,

    habe wieder ein Problem in der read_rb und rb_setzen Funktion.

    In der rb_setzen Funktion wenn ich einen Button drücke hätte ich gerne dass es den Radio_button aktiviert bzw. setzt. Jedoch da passiert überhaupt nichts.

    Ebenso will ich dass es den Zustand des Buttons in der text_entry ausgibt.

    Also wenn ich einen Button drücke soll darüber der Radio_button aktiviert sein und wenn ich ganz am Ende auf OK drücke soll in der text_entry Funktion der Zustand ausgegeben werden.

    Wie kann ich von der rb_setzen Funktion den Zustand des Radio_buttons an die text_entry Funktion übergeben bzw. umgekehrt. Aus der text_entry Funktion den Zustand des radio_buttons herauslesen.

    hbox3= gtk_hbox_new (TRUE, 0);
      gtk_box_pack_start (GTK_BOX (vbox), hbox3, TRUE, TRUE, 0);
    
      vbox1= gtk_vbox_new (TRUE, 0);
      gtk_box_pack_start (GTK_BOX (hbox3), vbox1, TRUE, TRUE, 0);
    
      radio1= gtk_radio_button_new_with_label (NULL, "female");
      gtk_box_pack_start (GTK_BOX (vbox1), radio1, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (radio1), "activate", G_CALLBACK (read_rb), NULL);
    
      button1= gtk_button_new_with_label ("female");
      gtk_box_pack_start (GTK_BOX (vbox1), button1, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (button1), "clicked", G_CALLBACK (rb_setzen), NULL);
    
      vbox2= gtk_vbox_new (TRUE, 0);
      gtk_box_pack_start (GTK_BOX (hbox3), vbox2, TRUE, TRUE, 0);
    
      radio2= gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio1), "male");
      gtk_box_pack_start (GTK_BOX (vbox2), radio2, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (radio2), "activate", G_CALLBACK (read_rb), NULL);
    
      button2= gtk_button_new_with_label ("male");
      gtk_box_pack_start (GTK_BOX (vbox2), button2, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (button2), "clicked", G_CALLBACK (rb_setzen), NULL);
    
      vbox3= gtk_vbox_new (TRUE, 0);
      gtk_box_pack_start (GTK_BOX (hbox3), vbox3, TRUE, TRUE, 0);
    
      radio3= gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio1), "nothing");
      gtk_box_pack_start (GTK_BOX (vbox3), radio3, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (radio1), "activate", G_CALLBACK (read_rb), NULL);
    
      button3= gtk_button_new_with_label ("nothing");
      gtk_box_pack_start (GTK_BOX (vbox3), button3, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (button3), "clicked", G_CALLBACK (rb_setzen), NULL);
    
    static void text_entry (GtkWidget *widget, gpointer data)
    {
      const gchar *text;
    
      text= gtk_entry_get_text (GTK_ENTRY (entry) );
      gtk_label_set_text (GTK_LABEL (label), text);
      printf ("%s\n", text);
      gtk_entry_set_text (GTK_ENTRY (entry), "");
      //g_object_set (GTK_OBJECT(okbutton), "focus-on-click", FALSE, NULL);
    }
    
    static void read_rb (GtkWidget *button, gpointer *data)
    {
      gboolean r1, r2, r3;
    
      g_object_get (GTK_RADIO_BUTTON (radio1),"active",&r1,NULL);
      g_object_get (GTK_RADIO_BUTTON (radio2),"active",&r2,NULL);
      g_object_get (GTK_RADIO_BUTTON (radio3),"active",&r3,NULL);
      if (r1==TRUE)
        g_print ("Radio Button 1 ist aktiviert.\n");
      if (r2==TRUE)
        g_print ("Radio Button 2 ist aktiviert.\n");
      if (r3==TRUE)
        g_print ("Radio Button 3 ist aktiviert.\n");
    }
    
    static void rb_setzen (GtkWidget *widget, gpointer data)
    {
      gboolean but1, but2, but3;
    
      g_object_get (GTK_BUTTON (button1),"focus-on-click",&but1,NULL);
      g_object_get (GTK_BUTTON (button2),"focus-on-click",&but2,NULL);
      g_object_get (GTK_BUTTON (button3),"focus-on-click",&but3,NULL);
    
      if (but1==TRUE)
      {
        g_object_set (GTK_RADIO_BUTTON (radio1), "active", NULL);
        g_print ("Hallo1.\n");
      }
      if (but2==TRUE)
      {
      	g_object_set (GTK_RADIO_BUTTON (radio2), "active", NULL);
      	g_print ("Hallo2.\n");
      }
      if (but3==TRUE)
      {
      	g_object_set (GTK_RADIO_BUTTON (radio3), "active", NULL);
      	g_print ("Hallo3.\n");
      }
    }
    

    MfG



  • Habe vergesse zu erwähnen dass in der rb_setzen Funktion alle Zustände auf True sind und nicht nur die wo der Radio_button aktiviert ist.



  • Habe hier bisschen aus dem Programm ausgeschnitten.

    Das Problem ist dass ich nicht in die Funktion

    static void read_rb (GtkWidget *button, gpointer *data)
    

    komme.

    Ich vermute dass hat was in dieser Zeile mit activate zu tun.

    g_signal_connect (G_OBJECT (radio1), "activate", G_CALLBACK (read_rb), NULL);
    

    Das nächste Problem ist dass in der Funktion

    static void rb_setzen (GtkWidget *widget, gpointer data)
    

    alle if-Abfragen TRUE sind. Es sollte aber nur die Abfrage true sein wo der Radio-Button aktiviert ist.

    vbox1= gtk_vbox_new (TRUE, 0);
      gtk_box_pack_start (GTK_BOX (hbox3), vbox1, TRUE, TRUE, 0);
    
      radio1= gtk_radio_button_new_with_label (NULL, "female");
      gtk_box_pack_start (GTK_BOX (vbox1), radio1, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (radio1), "activate", G_CALLBACK (read_rb), NULL);
    
      button1= gtk_button_new_with_label ("female");
      gtk_box_pack_start (GTK_BOX (vbox1), button1, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (button1), "clicked", G_CALLBACK (rb_setzen), NULL);
    
    static void read_rb (GtkWidget *button, gpointer *data)
    {
      gboolean r1, r2, r3;
    
      g_object_get (GTK_RADIO_BUTTON (radio1),"active",&r1,NULL);
      g_object_get (GTK_RADIO_BUTTON (radio2),"active",&r2,NULL);
      g_object_get (GTK_RADIO_BUTTON (radio3),"active",&r3,NULL);
      if (r1==TRUE)
        g_print ("Radio Button 1 ist aktiviert.\n");
      if (r2==TRUE)
    }
    
    static void rb_setzen (GtkWidget *widget, gpointer data)
    {
      gboolean but1, but2, but3;
    
      g_object_get (GTK_BUTTON (button1),"focus-on-click",&but1,NULL);
      g_object_get (GTK_BUTTON (button2),"focus-on-click",&but2,NULL);
      g_object_get (GTK_BUTTON (button3),"focus-on-click",&but3,NULL);
    
      if (but1==TRUE)
      {
        g_object_set (GTK_RADIO_BUTTON (radio1), "active", NULL);
        g_print ("Hallo1.\n");
      }
      if (but2==TRUE)
      {
    
      }
      if (but3==TRUE)
      {
    
      }
    }
    

    Vielleicht könnt ihr den Fehler finden.

    MfG



  • Habe hier bisschen aus dem Programm ausgeschnitten.

    Das Problem ist dass ich nicht in die Funktion

    static void read_rb (GtkWidget *button, gpointer *data)
    

    komme.

    Ich vermute dass hat was in dieser Zeile mit activate zu tun.

    g_signal_connect (G_OBJECT (radio1), "activate", G_CALLBACK (read_rb), NULL);
    

    Das nächste Problem ist dass in der Funktion

    static void rb_setzen (GtkWidget *widget, gpointer data)
    

    alle if-Abfragen TRUE sind. Es sollte aber nur die Abfrage true sein wo der Radio-Button aktiviert ist.

    vbox1= gtk_vbox_new (TRUE, 0);
      gtk_box_pack_start (GTK_BOX (hbox3), vbox1, TRUE, TRUE, 0);
    
      radio1= gtk_radio_button_new_with_label (NULL, "female");
      gtk_box_pack_start (GTK_BOX (vbox1), radio1, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (radio1), "activate", G_CALLBACK (read_rb), NULL);
    
      button1= gtk_button_new_with_label ("female");
      gtk_box_pack_start (GTK_BOX (vbox1), button1, TRUE, TRUE, 0);
      g_signal_connect (G_OBJECT (button1), "clicked", G_CALLBACK (rb_setzen), NULL);
    
    static void read_rb (GtkWidget *button, gpointer *data)
    {
      gboolean r1, r2, r3;
    
      g_object_get (GTK_RADIO_BUTTON (radio1),"active",&r1,NULL);
      g_object_get (GTK_RADIO_BUTTON (radio2),"active",&r2,NULL);
      g_object_get (GTK_RADIO_BUTTON (radio3),"active",&r3,NULL);
      if (r1==TRUE)
        g_print ("Radio Button 1 ist aktiviert.\n");
      if (r2==TRUE)
    }
    
    static void rb_setzen (GtkWidget *widget, gpointer data)
    {
      gboolean but1, but2, but3;
    
      g_object_get (GTK_BUTTON (button1),"focus-on-click",&but1,NULL);
      g_object_get (GTK_BUTTON (button2),"focus-on-click",&but2,NULL);
      g_object_get (GTK_BUTTON (button3),"focus-on-click",&but3,NULL);
    
      if (but1==TRUE)
      {
        g_object_set (GTK_RADIO_BUTTON (radio1), "active", NULL);
        g_print ("Hallo1.\n");
      }
      if (but2==TRUE)
      {
    
      }
      if (but3==TRUE)
      {
    
      }
    }
    

    Vielleicht könnt ihr den Fehler finden.

    MfG


Anmelden zum Antworten