GtkTextView beim klick auf einen Button füllen



  • Hallo, ich versuche schon seid einer weile beim klick auf den Button das textview1 mit Inhalt zu füllen.

    Das klappt aber leider nicht so wirklich, wenn ich die betreffenden Zeilen in die main funktion einfüge wird das Textfeld gefüllt, aber leider nicht beim klick auf den Button.

    Ich hoffe mir kann da Jemand helfen.

    #include <gtk/gtk.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /*
    gcc -o main main.c `pkg-config --libs --cflags gtk+-2.0 gmodule-2.0`
    
    */
    
    extern void on_window1_destroy(GtkWidget *widget, gpointer user_data){
     gtk_main_quit();
    }
    
    extern void on_decode_clicked(GtkWidget *widget, gpointer user_data){
    
    }
    
    extern void on_encode_clicked(GtkWidget *widget, gpointer user_data){
    
        GError    *error = NULL;
        GtkBuilder    *builder;
        GtkTextBuffer *buffer;
        GtkWidget *textview1;
        GtkTextIter iter; 
    
        builder = gtk_builder_new();
    
        // Hier übergeben wir das File an den GTK Parser
        if( ! gtk_builder_add_from_file( builder, "gui.glade", &error ) ){
            printf( "%s\n", error->message );
            g_free( error );
        }
    
        textview1 = GTK_WIDGET( gtk_builder_get_object( builder,"textview1") );  
        buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview1));
        gtk_text_buffer_set_text(buffer,"Geben Sie hier ihre Nachricht ein !", -1); 
        printf("klick\n");
    }
    
    int main( int argc,char **argv ){
        GtkWidget    *window;
        GError    *error = NULL;
        GtkBuilder    *builder;
        gtk_init( &argc, &argv );
    
        //Jetzt legen wir einen Bereich für das Glade File an und vergeben
        //einen Namen (builder)
        builder = gtk_builder_new();
    
        // Hier übergeben wir das File an den GTK Parser
        if( ! gtk_builder_add_from_file( builder, "gui.glade", &error ) ){
            printf( "%s\n", error->message );
            g_free( error );
            return( 1 );
        }
    
        window   = GTK_WIDGET( gtk_builder_get_object( builder,"window1") );
    
        gtk_builder_connect_signals( builder, NULL );
    
        //Die Ressourcen für das Glade File werden wieder frei gegeben
        g_object_unref( G_OBJECT( builder ) );
    
        //Das Fenster wird angezeigt
        gtk_widget_show_all( window );
    
        gtk_main();
    
        return( 0 );
    }
    

    Das Gladefile:

    <?xml version="1.0"?>
    <interface>
      <requires lib="gtk+" version="2.16"/>
      <!-- interface-naming-policy project-wide -->
      <object class="GtkWindow" id="window1">
        <property name="window_position">center-always</property>
        <signal name="destroy" handler="on_window1_destroy"/>
        <child>
          <object class="GtkFixed" id="fixed1">
            <property name="visible">True</property>
            <child>
              <object class="GtkTextView" id="textview1">
                <property name="width_request">470</property>
                <property name="height_request">150</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
              </object>
              <packing>
                <property name="x">37</property>
                <property name="y">37</property>
              </packing>
            </child>
            <child>
              <object class="GtkTextView" id="textview2">
                <property name="width_request">470</property>
                <property name="height_request">150</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
              </object>
              <packing>
                <property name="x">37</property>
                <property name="y">232</property>
              </packing>
            </child>
            <child>
              <object class="GtkLabel" id="label1">
                <property name="width_request">110</property>
                <property name="height_request">35</property>
                <property name="visible">True</property>
                <property name="xalign">0</property>
                <property name="label" translatable="yes">Text:	</property>
              </object>
              <packing>
                <property name="x">37</property>
                <property name="y">2</property>
              </packing>
            </child>
            <child>
              <object class="GtkLabel" id="label2">
                <property name="width_request">110</property>
                <property name="height_request">35</property>
                <property name="visible">True</property>
                <property name="xalign">0</property>
                <property name="label" translatable="yes">Verschl&#xFC;sselt:</property>
              </object>
              <packing>
                <property name="x">37</property>
                <property name="y">197</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="decode">
                <property name="label" translatable="yes">Verschl&#xFC;sseln</property>
                <property name="width_request">100</property>
                <property name="height_request">35</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="on_decode_clicked"/>
              </object>
              <packing>
                <property name="x">409</property>
                <property name="y">395</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="encode">
                <property name="label" translatable="yes">Entschl&#xFC;sseln</property>
                <property name="width_request">100</property>
                <property name="height_request">35</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="on_encode_clicked"/>
              </object>
              <packing>
                <property name="x">297</property>
                <property name="y">394</property>
              </packing>
            </child>
          </object>
        </child>
      </object>
    </interface>
    

    Vielen dank für jeden Post.



  • user2582 schrieb:

    Ich hoffe mir kann da Jemand helfen.

    Ich versuch's mal:

    --- main.c
    +++ main.c
    @@ -19,24 +19,8 @@
     }
    
     extern void on_encode_clicked(GtkWidget *widget, gpointer user_data){
    -
    -    GError    *error = NULL;
    -    GtkBuilder    *builder;
    -    GtkTextBuffer *buffer;
    -    GtkWidget *textview1;
    -    GtkTextIter iter;
    -
    -    builder = gtk_builder_new();
    -
    -    // Hier übergeben wir das File an den GTK Parser
    -    if( ! gtk_builder_add_from_file( builder, "gui.glade", &error ) ){
    -        printf( "%s\n", error->message );
    -        g_free( error );
    -    }
    -
    -
    -    textview1 = GTK_WIDGET( gtk_builder_get_object( builder,"textview1") );  
    -    buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview1));
    +    GtkWidget *textview1 = GTK_WIDGET(widget);
    +    GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview1));
         gtk_text_buffer_set_text(buffer,"Geben Sie hier ihre Nachricht ein !", -1);
         printf("klick\n");
     }
    --- gui.glade
    +++ gui.glade
    @@ -81,7 +81,7 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
    -            <signal name="clicked" handler="on_encode_clicked"/>
    +            <signal name="clicked" handler="on_encode_clicked" object="textview1"/>
               </object>
               <packing>
                 <property name="x">297</property>
    

    Nur um sicher zu gehen: am besten markierst du diesen Patch mit der Maus und gibst dann in der Konsole `` xclip -o | patch '' ein.



  • Leider verstehe ich nicht genau was du da genau meinst.

    Wieso nimmst du das übergebende Widget und versuchst meine Variable('textview1') zu überschreiben, oder neu zu erstellen?

    Ich habe versucht deine Änderung zu übernehmen, was aber leider nicht funktioniert hat.

    Versucht zu kompilieren mit folgender Eingabe:
    gcc -o main main.c `pkg-config --libs --cflags gtk+-2.0 gmodule-2.0`

    main.c:37: error: redeclaration of ‘textview1’ with no linkage
    main.c:26: note: previous declaration of ‘textview1’ was here



  • Vermutlich sind erklärende Worte besser, wie ein Patch, den du nicht anwenden kannst (der Fehler dürfte so nicht auftreten, ich glaube, der Fehler liegt im patchen --> Wikipedia).

    Ich verstehe dein Problem so, dass du den Textbuffer der textview1 ändern willst.
    Was du aber machst ist folgendes: du erstellst noch einmal die gesamte Oberfläche, so dass jedes Widget mehrfach im vorkommt. Von der neuesten dieser Kopien greifst du textview1 heraus (was ein anderes ist, als das du auf dem Bildschirm siehst) änderst von diesem den Textbuffer. Nur willst du ja den originalen.

    Daher mein verzweifelter Ansatz: ich übergebe das echte textview1 als Parameter an die Funktion (darum das `` object="textview1" ''), und nehme die Veränderungen an diesem vor. An meinem Rechner klappt das.

    Wenn ich schon am schreiben bin, hier noch einmal der Hinweise, dass ich lieber alles von Hand code und es Leuten wie dir dringend ans Herz legen würde, da es hilft, die Abläufe zu verstehen. Glade mag zwar sehr RAD sein, aber wirklich effektiv wirst du erst, wenn du nicht ständig an banalen Verständnisproblemen scheiterst.

    PS: Im letzen Post habe ich etwas versäumt: http://www.seit-seid.de/



  • user2582 schrieb:

    if( ! gtk_builder_add_from_file( builder, "gui.glade", &error )

    Ich habe jetzt Deinen Code nicht vollständig analysiert, aber das kommt immerhin zweimal vor....
    Ich denke, jetzt sollten wir etwas analytischer vorgehen:
    Was heisst:

    Hallo, ich versuche schon seid einer weile beim klick auf den Button das textview1 mit Inhalt zu füllen.

    Beschreibe doch einfach konkret, was Du machen willst... Für GTK+ gibt es da sicher eine Lösung.

    Ach ja... Glade ist zwar nicht ohne Bugs - aber nice to have 🙂



  • Seit(thx) vorgestern beschäftige ich mich mit GKT+ und ich habe mit diesem Codeschnippel versucht bei einem Klick auf den den Button 'Entschlüsseln' das Textfeld 'textfield1' mit irgendeiner Zeichenkette zu füllen.



  • user2582 schrieb:

    Seit(thx) vorgestern beschäftige ich mich mit GKT+ und ich habe mit diesem Codeschnippel versucht bei einem Klick auf den den Button 'Entschlüsseln' das Textfeld 'textfield1' mit irgendeiner Zeichenkette zu füllen.

    Das ist nicht ganz einfach - ich weiss ja immer noch nicht, was Du genau machen willst...
    Schaue Dir mal folgende Statements an (via Google)

    gtk_text_view_get_buffer
    gtk_text_buffer_set_text

    Und wenn Du das etwa von einem File haben willst, schau mal da nach:

    g_file_get_contents


Log in to reply