GTK - Невозможно напечатать значение буфера, используя функцию `printf` - PullRequest
0 голосов
/ 23 марта 2020

Я получаю содержимое моего textview и хочу отобразить содержимое в терминале с помощью функции printf. Но есть странные символы (почему?):

enter image description here

// get textbuffer from textview end print value in terminal
void on_lower_button_clicked(GtkWidget *lower_button, GtkTextView *textview_1)
{
    GtkTextBuffer *textbuffer_1;
    textbuffer_1 = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview_1));
    printf("%s\n", textbuffer_1); // strange symbols from my buffer ...
}

int main(int argc, char *argv[])
{
  GtkWidget *lower_button;
  GtkBuilder *builder;
  GtkWidget *window;
  GError *error = NULL;

  gtk_init(&argc, &argv);

  builder = gtk_builder_new();
  if(!gtk_builder_add_from_file(builder, "template.ui", &error)) {
    g_printerr("Error loading file: %s\n", error->message);
    g_clear_error(&error);
    return 1;
  }

  window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
  lower_button = GTK_WIDGET(gtk_builder_get_object(builder, "lower_button"));

  gtk_builder_connect_signals(builder, NULL);
  // when I click on the button (lower_button) call 
  // on_lower_button_clicked function and transferred to her textview_1
  g_object_unref(G_OBJECT(builder));

  gtk_widget_show(window);
  gtk_main();

  return 0;
}

1 Ответ

3 голосов
/ 23 марта 2020

GtkTextBuffer - это не массив символов, это объект GTK, который нельзя просто напечатать в виде текста.

Вам необходимо извлечь из него текст, если вы хотите напечатать его или записать в file.

Для этого вам нужно получить пару GtkTextIter объектов, а затем использовать gtk_text_buffer_get_text.

Обратите внимание, что если у вас не символы Engli sh в вашем тексте у вас все еще могут быть проблемы с использованием printf, поскольку полученный текст имеет кодировку UTF-8.

Вот пример кода:

GtkTextIter start, end;
gchar *text;

gtk_text_buffer_get_start_iter(textview_1, &start);
gtk_text_buffer_get_end_iter(textview_1, &end);

text = gtk_text_buffer_get_text(textview_1, &start, &end, FALSE);

printf("%s\n",text);

g_free(text); //you need to clean up this buffer!
...