LINUX.ORG.RU

кодинг с ГТК2 в Анюте


0

0

Я сижу в Анюте, сварганил интерфейс в glade-2. Я кинул компонент в форму - gtk_text_view, и добавил туда текст, чтоб пусто не было. По нажатию кнопки текст должен сменится на текст из переменной text типа gchar. Я юзаю следующий код:

GtkTextBuffer *b; b=gtk_text_view_get_buffer(GTK_TEXT_VIEW(tv)); gtk_text_buffer_set_text(GTK_TEXT_BUFFER(b),text,strlen(text));

Все компилится, но при запуске, при нажатие на кнопку текст в tv не меняется, а в консоль выводится следующее:

(anadventure:4320): Gtk-CRITICAL **: file gtktextview.c: line 1210 (gtk_text_view_get_buffer): assertion `GTK_IS_TEXT_VIEW (text_view)' failed (anadventure:4320): Gtk-CRITICAL **: file gtktextbuffer.c: line 495 (gtk_text_buffer_set_text): assertion `GTK_IS_TEXT_BUFFER (buffer)' failed

Посоветуйте как правильно изменить текст в gtk_text_view

anonymous

Just give me your mail. I'll try to send you complete example. It takes 5 miute to do that.

anonymous
()

Your problem is that you don't read your program output. Your *tv is really _not_ GTK_TEXT_VIEW.

Here is complete example. How you can build it

1. Save prj.glade in some dir and open it with glade-2.
2. Build project in glade-2 to get working project.
3. Replace file callbacks.c with given file
4. Learn gtk and enjoy.

-------------------prj.glade-----------------------
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">;

<glade-interface>

<widget class="GtkWindow" id="window1">
  <property name="visible">True</property>
  <property name="title" translatable="yes">window1</property>
  <property name="type">GTK_WINDOW_TOPLEVEL</property>
  <property name="window_position">GTK_WIN_POS_NONE</property>
  <property name="modal">False</property>
  <property name="resizable">True</property>
  <property name="destroy_with_parent">False</property>

  <child>
    <widget class="GtkVBox" id="vbox1">
      <property name="visible">True</property>
      <property name="homogeneous">False</property>
      <property name="spacing">0</property>

      <child>
	<widget class="GtkScrolledWindow" id="scrolledwindow1">
	  <property name="visible">True</property>
	  <property name="can_focus">True</property>
	  <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
	  <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
	  <property name="shadow_type">GTK_SHADOW_NONE</property>
	  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>

	  <child>
	    <widget class="GtkTextView" id="textview1">
	      <property name="visible">True</property>
	      <property name="can_focus">True</property>
	      <property name="editable">True</property>
	      <property name="justification">GTK_JUSTIFY_LEFT</property>
	      <property name="wrap_mode">GTK_WRAP_NONE</property>
	      <property name="cursor_visible">True</property>
	      <property name="pixels_above_lines">0</property>
	      <property name="pixels_below_lines">0</property>
	      <property name="pixels_inside_wrap">0</property>
	      <property name="left_margin">0</property>
	      <property name="right_margin">0</property>
	      <property name="indent">0</property>
	      <property name="text" translatable="yes"></property>
	    </widget>
	  </child>
	</widget>
	<packing>
	  <property name="padding">0</property>
	  <property name="expand">True</property>
	  <property name="fill">True</property>
	</packing>
      </child>

      <child>
	<widget class="GtkButton" id="button1">
	  <property name="visible">True</property>
	  <property name="can_focus">True</property>
	  <property name="label" translatable="yes">button1</property>
	  <property name="use_underline">True</property>
	  <property name="relief">GTK_RELIEF_NORMAL</property>
	  <signal name="clicked" handler="on_button1_clicked" last_modification_time="Fri, 26 Sep 2003 19:27:42 GMT"/>
	</widget>
	<packing>
	  <property name="padding">0</property>
	  <property name="expand">False</property>
	  <property name="fill">False</property>
	</packing>
      </child>
    </widget>
  </child>
</widget>

</glade-interface>

------------------------callbacks.c--------------------
#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <gtk/gtk.h>

#include "callbacks.h"
#include "interface.h"
#include "support.h"

static int counter=0;

void
on_button1_clicked                     (GtkButton       *button,
                                        gpointer         user_data)
{
  GtkWidget *text_widget;
  GtkTextBuffer *buffer;
  
  gchar *string;
  
  text_widget = lookup_widget(GTK_WIDGET(button),"textview1");
  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget));
  
  string = g_strdup_printf("Attempt   %d", counter);
  counter++;
  
  gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buffer), string, strlen(string));
  g_free(string);
  
  return;
}

anonymous
()

notffeq@mail.ru - мой мыл, а я пока пойду пробовать код от anonymous (*) (2003-09-26 23:49:11.407262)

anonymous
()

Теперь оно работает, но проблемы не кончились. Дело в том, что текст переменной text я гружу из файла с кодировкой cp1251. С переменной все впорядке - я специально выводил ее содержимое в консоль, чтоб убедится в этом. Но при попытке загрузить текст переменной в tv выдается ошибка:

(prog:17125): Gtk-CRITICAL **: file gtktextbuffer.c: line 543 (gtk_text_buffer_emit_insert): assertion `g_utf8_validate (text, len, NULL)' failed

Заглянул в докву по gtk2, там написано, что в функции gtk_text_buffer_set_text(GTK_TEXT_BUFFER(b),text,strlen(part_to_show)); переменная text должна быть utf8. Вопрос: ктонить знает как загрузить переменную не с utf8 (а с cp1251 или koi8-r) в етот GtkTextBuffer *b; ?

anonymous
()

Have you ever heard about library functions? Read manual on glib.


/* Note: result should be freed with g_free() */
gchar *from_win_to_utf(gchar *text)
{
GError *err = NULL;
gint bytes_read, bytes_written;
gchar *result;
result = g_convert(text, strlen(text), "utf-8", "cp1251", 
             &bytes_read, &bytes_written, &err);

return result;
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.