Программное обновление текстовой записи GTK

Я хотел бы обновить текстовую запись при нажатии клавиши.

В моем сценарии нет клавиатуры, поэтому я генерирую ее программно и пытаюсь обновить текстовую запись из обработчика событий нажатия клавиш.

При каждом нажатии клавиши мне нужно обновить текстовую запись в окне GTK. Как я могу этого добиться? Я пытался

gtk_entry_set_text (GTK_ENTRY (entry1), buffer);

но это дает ошибку сегментации.

Я буду получать данные из некоторых других пользовательских потоков, мне нужно обновить текстовую запись новыми данными и показать окно gtk с обновленной текстовой записью.

Ниже приведен мой полный код:

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 источник
comment
gtk_entry_set_text — правильный API. Получение ошибки сегментации означает, что entry1 не является экземпляром GtkEntry * или buffer не является строкой, заканчивающейся NUL: это так просто.   -  person ntd    schedule 29.05.2015
comment
вопрос изменен с кодом. буфер заполняется из другого потока   -  person tux tux    schedule 29.05.2015
comment
@tuxtux Где buffer? Как это декларируется? Ты все равно не показываешь. А обновление из другой ветки звучит очень страшно. Попробуйте использовать константу (строковый литерал) вместо buffer в вызове, посмотрите, работает ли это.   -  person unwind    schedule 29.05.2015
comment
То, что вы опубликовали, не показывает проблему: вы должны сделать минимальный автономный тестовый пример.   -  person Jussi Kukkonen    schedule 29.05.2015
comment
также попробовал строку образца ok вместо буфера (чтобы избежать сомнений во внешнем потоке). но результат тот же.   -  person tux tux    schedule 29.05.2015
comment
Ваш обработчик использует GdkEventExpose, а не GdkEventKey. Он также не показывает, что создает GtkEntry. Можете ли вы добавить код, который вы заменили на //create window?   -  person andlabs    schedule 29.05.2015
comment
добавлен код для окна //create. На самом деле я создаю окно из файла поляны, используя опцию компоновщика.   -  person tux tux    schedule 30.05.2015
comment
Привет всем, сегодня нашел какое-то решение, я использовал пользовательский сигнал пользователя, который работал нормально. g_signal_new (пользовательский сигнал, G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST, 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); тот же обработчик ключевых событий, который я перенаправил на пользовательский сигнал.   -  person tux tux    schedule 30.05.2015
comment
Не создавайте собственные сигналы. Ваша проблема в том, что вы никогда не назначали entry1 из своего файла билдера!   -  person andlabs    schedule 30.05.2015
comment
спасибо илаб. jst теперь добавил задание, теперь он может получить доступ.   -  person tux tux    schedule 30.05.2015


Ответы (1)


Вы никогда не назначали переменную entry1 из своего GtkBuilder, поэтому entry1 по-прежнему равно NULL во время сигнала, и программа вылетает. Вы сделали это для window; делать это для entry1 аналогично.

person andlabs    schedule 30.05.2015