GTK gtk_text_buffer_get_end_iter和gtk_text_buffer_insert 错误

发布于 2022-09-10 22:38:22 字数 10651 浏览 14 评论 6

本帖最后由 warmb2009 于 2010-08-24 13:04 编辑

  1. #include <gtk/gtk.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. /*向回调函数传两个参数*/
  5. typedef struct
  6. {
  7.         GtkWidget *entry;
  8.         GtkTextBuffer *buffer;
  9. }strentry;
  10. /*
  11.         ( button )scan的回调函数 , 执行shell命令 将输出返回给text_view
  12.                                                                                 */
  13.                                                                                
  14. void callback( GtkWidget *widget, strentry *sentry )
  15. {
  16.         const gchar *text;
  17.         gchar com[50] = "nmap ";
  18.         FILE *fpin;
  19.         char buf[1024] = {''};
  20.         GtkTextIter start, end;
  21.         text = gtk_entry_get_text( GTK_ENTRY( sentry->entry ) );
  22.         strcat( com, (char * )text );
  23.        
  24.         if( ( fpin = popen( com, "r" ) ) == NULL )
  25.                 {
  26.                         printf("popen error!n");
  27.                         exit( 0 );
  28.                 }
  29.         fread( buf, sizeof( char ), sizeof( buf ),  fpin );
  30.        
  31. /*
  32.         将shell命令结果返回给text_view
  33.                                                 */
  34.                                                
  35.         gtk_text_buffer_get_end_iter ( sentry->buffer, &end );
  36.         gtk_text_buffer_insert( sentry->buffer, &end, buf, -1 );
  37.         pclose( fpin );
  38.        
  39. }
  40. gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
  41. {
  42.         gtk_main_quit ();
  43.         return FALSE;
  44. }
  45. /*
  46.         初始化text_view
  47.                                 */
  48.                                
  49. void insert_text (GtkTextBuffer *buffer)
  50. {
  51.         GtkTextIter iter;
  52.         gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
  53.         gtk_text_buffer_insert (buffer, &iter, " NMAP GUI n", -1);
  54. }
  55. /*
  56.         创建一个文本框 两个按钮
  57.                                 */
  58. GtkWidget *creat_button( GtkWidget *table ,strentry *sentry )
  59. {
  60.         GtkWidget *button;
  61.         GtkWidget *label;
  62.         /*const gchar *text;*/
  63.         label = gtk_label_new("Command: ");
  64.         gtk_table_attach_defaults(GTK_TABLE( table ), label, 0, 2, 1, 2 );
  65.         gtk_widget_show( label );
  66.        
  67.         sentry->entry = gtk_entry_new();
  68.         gtk_table_attach_defaults(GTK_TABLE( table ), sentry->entry, 2, 10, 1, 2 );
  69.         gtk_widget_show (sentry->entry);
  70.        
  71.         button = gtk_button_new_with_label ("Scaning!");
  72.         g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), sentry );
  73.         gtk_table_attach_defaults(GTK_TABLE( table ), button, 15, 17, 1, 2 );
  74.         gtk_widget_show( button );
  75.        
  76.         button = gtk_button_new_with_label("Stop");
  77.         g_signal_connect(G_OBJECT (button), "clicked", G_CALLBACK(delete_event), NULL);
  78.         gtk_table_attach_defaults(GTK_TABLE( table ), button, 17, 19, 1, 2 );
  79.         gtk_widget_show ( button );
  80.         return table;
  81.        
  82. }
  83. /*
  84.         创建text_view
  85.                                 */
  86. GtkWidget *creat_text( GtkTextBuffer *buffer )
  87. {
  88.         GtkWidget *scrolled_window;
  89.         GtkWidget *view;
  90.        
  91.         view = gtk_text_view_new ();
  92.         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  93.         scrolled_window = gtk_scrolled_window_new (NULL, NULL);
  94.         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
  95.                                         GTK_POLICY_AUTOMATIC,
  96.                                         GTK_POLICY_AUTOMATIC);
  97.         gtk_container_add (GTK_CONTAINER (scrolled_window), view);
  98.         insert_text (buffer);
  99.         gtk_widget_show_all (scrolled_window);
  100.        
  101.         return scrolled_window;
  102. }
  103. int main( int argc, char *argv[] )
  104. {
  105.         GtkWidget *window;
  106.         GtkWidget *button;
  107.         GtkWidget *text;
  108.         GtkWidget *table;
  109.         strentry *sentry;
  110.        
  111.         /*
  112.                 初始化窗口
  113.                                 */
  114.                                
  115.         gtk_init (&argc, &argv);
  116.         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  117.         gtk_window_set_default_size( GTK_WINDOW( window ), 1024, 800 );
  118.        
  119.         /*
  120.                 添加按钮事件
  121.                                 */
  122.                                
  123.         gtk_window_set_title (GTK_WINDOW (window), "Nmap easy scan");
  124.         g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL );
  125.         gtk_container_set_border_width (GTK_CONTAINER (window), 10);
  126.         table = gtk_table_new( 20, 20, TRUE );
  127.         gtk_container_add( GTK_CONTAINER( window ), table );
  128.        
  129.         /*
  130.                 创建外观元素
  131.                                 */
  132.                                
  133.         button = creat_button( table, sentry );
  134.         text = creat_text( sentry->buffer );
  135.        
  136.         gtk_table_attach_defaults(GTK_TABLE( table ), text, 0, 20, 4, 20 );
  137.         gtk_widget_show( text );
  138.                
  139.         gtk_widget_show ( table );
  140.         gtk_widget_show ( window );
  141.         gtk_main ();
  142.         return 0;
  143. }

复制代码当触发callback() 时也就是第十六行的函数
出现错误:

  1. (gtk2:14413): Gtk-CRITICAL **: gtk_text_buffer_get_end_iter: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed
  2. (gtk2:14413): Gtk-CRITICAL **: gtk_text_buffer_insert: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed

复制代码求助诸位大牛 , 希望帮帮忙解决这个问题 ,小弟不甚感激!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

私藏温柔 2022-09-11 02:46:18

晕,我哪个回复怎么成2楼了?时间也不对了。

不喜欢何必死缠烂打 2022-09-11 02:45:55

回复 3# warmb2009

    将所有回调之外的函数整合近main,那creat_text这个函数你是怎么整合的?
    是在main中直接给 strentry的buffer成员赋值吧:

  1. strentry->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));

复制代码这样当然没问题了,因为 strentry的成员buffer正确赋值了,以后用才不会出问题。而当你把 TextBuffer作为一个参数的时候,
在函数体内部怎么折腾这个参数都不影响函数之外,因为c语言是参数传递机制是值调用,这些值被放在被调用函数的形参的内存位置上(就是栈中)。
原来的变量还在那儿,没有被修改。

这都是c语言基础的东西。lz以前不是搞c的吗?搞java的?java对于不是基本类型的参数采用的是引用调用

仙女 2022-09-11 02:38:06

回复 1# warmb2009

我回复了。

死开点丶别碍眼 2022-09-11 02:35:01

你的main函数里,sentry这个指针是个野指针,没有赋过值,所以到了回调函数里,指针指向的buffer和entry,都可能会有问题

最佳男配角 2022-09-11 01:27:01

将所有除回调函数以外的函数整合进main , 就没有错误了....这是什么原因阿 ??是不是作用域的问题阿??

勿忘初心 2022-09-10 23:55:22

本帖最后由 nketc 于 2010-11-11 00:15 编辑

有两处需要修改:
1)main中没有给strentry分配空间
2)creat_text的  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); 是有问题的,这样复制只是修改的栈中的局部变量,而 strentry->buffer仍然是随机值。
修改后的代码如下:

/*
        创建text_view
                                */
GtkWidget *creat_text( GtkTextBuffer **buffer )
{
        GtkWidget *scrolled_window;
        GtkWidget *view;
        
        view = gtk_text_view_new ();
       *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
        scrolled_window = gtk_scrolled_window_new (NULL, NULL);
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                                        GTK_POLICY_AUTOMATIC,
                                        GTK_POLICY_AUTOMATIC);
        gtk_container_add (GTK_CONTAINER (scrolled_window), view);
        insert_text (*buffer);
        gtk_widget_show_all (scrolled_window);
        
        return scrolled_window;
}

int main( int argc, char *argv[] )
{

        GtkWidget *window;
        GtkWidget *button;
        GtkWidget *text;
        GtkWidget *table;
        strentry *sentry = g_malloc(sizeof(strentry));
        
        ………………
                                
        button = creat_button( table, sentry );
       text = creat_text( &sentry->buffer );
        
        gtk_table_attach_defaults(GTK_TABLE( table ), text, 0, 20, 4, 20 );
        gtk_widget_show( text );
               
        gtk_widget_show ( table );
        gtk_widget_show ( window );
        gtk_main ();
       g_free(strentry);
        return 0;
}

红色部分是要修改的地方。
下面是运行截图:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文