Entri teks GTK diperbarui secara terprogram

Saya ingin memperbarui entri teks pada acara penekanan tombol.

Skenario saya tidak memiliki keyboard, jadi saya membuatnya secara terprogram dan mencoba memperbarui entri teks dari event handler penekanan tombol.

Pada setiap penekanan tombol, saya perlu memperbarui entri teks di jendela GTK. Bagaimana saya bisa mencapainya? Saya mencoba

gtk_entry_set_text (GTK_ENTRY (entry1), buffer);

tapi itu memberikan kesalahan segmentasi.

Saya akan mendapatkan data dari beberapa utas pengguna lain, saya perlu memperbarui entri teks dengan data baru dan menampilkan jendela gtk dengan entri teks yang diperbarui.

Berikut ini adalah kode lengkap saya:

GtkEntry *entry1;

static gboolean kp_event_S1_1(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{       
    printf(" - kp_event_S1_1 - \n");
    gtk_entry_set_text (GTK_ENTRY (entry1), buffer);
}


void S1_1(void )
{   
    GtkWidget *Win_1;
    GtkBuilder *builder;        
    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "/home/glade/glade1.glade", NULL);
    window = GTK_WIDGET (gtk_builder_get_object (builder, "Win_1"));
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit),NULL );
    g_signal_connect(G_OBJECT (window), "key_press_event", G_CALLBACK (kp_event_S1_1), NULL);
    gtk_widget_show_all(window);    
    gtk_main();
}

person tux tux    schedule 29.05.2015    source sumber
comment
gtk_entry_set_text adalah API yang benar. Mendapatkan kesalahan segmentasi berarti entry1 bukan instance GtkEntry * atau buffer bukan string yang diakhiri NUL: sesederhana itu.   -  person ntd    schedule 29.05.2015
comment
pertanyaan dimodifikasi dengan kode. buffer diisi dari thread lain   -  person tux tux    schedule 29.05.2015
comment
@tuxtux Dimana buffer? Bagaimana cara mendeklarasikannya? Anda masih belum menunjukkannya. Dan diperbarui dari thread lain terdengar sangat menakutkan. Coba dengan konstanta (string literal) alih-alih buffer dalam panggilan, lihat apakah itu berhasil.   -  person unwind    schedule 29.05.2015
comment
Apa yang Anda posting tidak menunjukkan masalahnya: Anda harus membuat test case mandiri yang minimal.   -  person Jussi Kukkonen    schedule 29.05.2015
comment
juga mencoba string sampel ok alih-alih buffer (untuk menghindari keraguan thread eksternal). tetapi hasilnya sama.   -  person tux tux    schedule 29.05.2015
comment
Penangan Anda menggunakan GdkEventExpose, bukan GdkEventKey. Itu juga tidak menunjukkan apa yang membuat GtkEntry. Bisakah Anda menambahkan kode yang Anda ganti dengan //create window?   -  person andlabs    schedule 29.05.2015
comment
menambahkan kode untuk //buat jendela. Sebenarnya saya membuat jendela dari file glade menggunakan opsi pembuat   -  person tux tux    schedule 30.05.2015
comment
Halo semuanya, hari ini saya mendapat solusi, saya menggunakan sinyal pengguna khusus, yang berfungsi dengan baik. g_signal_new(sinyal pengguna, G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST, 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); pengendali keyevent yang sama saya dialihkan ke sinyal pengguna.   -  person tux tux    schedule 30.05.2015
comment
Jangan membuat sinyal khusus. Masalah Anda adalah Anda tidak pernah menetapkan entry1 dari file pembuat Anda!   -  person andlabs    schedule 30.05.2015
comment
terima kasih dan lab. baru saja menambahkan tugas, itu dapat diakses sekarang.   -  person tux tux    schedule 30.05.2015


Jawaban (1)


Anda tidak pernah menetapkan variabel entry1 dari GtkBuilder Anda, jadi entry1 masih NULL pada saat sinyal muncul, dan program mogok. Anda melakukannya untuk window; melakukannya untuk entry1 serupa.

person andlabs    schedule 30.05.2015