- 论坛徽章:
- 0
|
20可用积分
本帖最后由 warmb2009 于 2010-08-24 13:04 编辑
- #include <gtk/gtk.h>
- #include <string.h>
- #include <stdlib.h>
- /*向回调函数传两个参数*/
- typedef struct
- {
- GtkWidget *entry;
- GtkTextBuffer *buffer;
- }strentry;
- /*
- ( button )scan的回调函数 , 执行shell命令 将输出返回给text_view
- */
-
- void callback( GtkWidget *widget, strentry *sentry )
- {
- const gchar *text;
- gchar com[50] = "nmap ";
- FILE *fpin;
- char buf[1024] = {'\0'};
- GtkTextIter start, end;
- text = gtk_entry_get_text( GTK_ENTRY( sentry->entry ) );
- strcat( com, (char * )text );
-
- if( ( fpin = popen( com, "r" ) ) == NULL )
- {
- printf("popen error!\n");
- exit( 0 );
- }
- fread( buf, sizeof( char ), sizeof( buf ), fpin );
-
- /*
- 将shell命令结果返回给text_view
- */
-
- gtk_text_buffer_get_end_iter ( sentry->buffer, &end );
- gtk_text_buffer_insert( sentry->buffer, &end, buf, -1 );
- pclose( fpin );
-
- }
- gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
- {
- gtk_main_quit ();
- return FALSE;
- }
- /*
- 初始化text_view
- */
-
- void insert_text (GtkTextBuffer *buffer)
- {
- GtkTextIter iter;
- gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
- gtk_text_buffer_insert (buffer, &iter, " NMAP GUI \n", -1);
- }
- /*
- 创建一个文本框 两个按钮
- */
- GtkWidget *creat_button( GtkWidget *table ,strentry *sentry )
- {
- GtkWidget *button;
- GtkWidget *label;
- /*const gchar *text;*/
- label = gtk_label_new("Command: ");
- gtk_table_attach_defaults(GTK_TABLE( table ), label, 0, 2, 1, 2 );
- gtk_widget_show( label );
-
- sentry->entry = gtk_entry_new();
- gtk_table_attach_defaults(GTK_TABLE( table ), sentry->entry, 2, 10, 1, 2 );
- gtk_widget_show (sentry->entry);
-
- button = gtk_button_new_with_label ("Scaning!");
- g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), sentry );
- gtk_table_attach_defaults(GTK_TABLE( table ), button, 15, 17, 1, 2 );
- gtk_widget_show( button );
-
- button = gtk_button_new_with_label("Stop");
- g_signal_connect(G_OBJECT (button), "clicked", G_CALLBACK(delete_event), NULL);
- gtk_table_attach_defaults(GTK_TABLE( table ), button, 17, 19, 1, 2 );
- gtk_widget_show ( button );
- return table;
-
- }
- /*
- 创建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;
-
- /*
- 初始化窗口
- */
-
- gtk_init (&argc, &argv);
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size( GTK_WINDOW( window ), 1024, 800 );
-
- /*
- 添加按钮事件
- */
-
- gtk_window_set_title (GTK_WINDOW (window), "Nmap easy scan");
- g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL );
- gtk_container_set_border_width (GTK_CONTAINER (window), 10);
- table = gtk_table_new( 20, 20, TRUE );
- gtk_container_add( GTK_CONTAINER( window ), table );
-
- /*
- 创建外观元素
- */
-
- 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 ();
- return 0;
- }
复制代码 当触发callback() 时也就是第十六行的函数
出现错误:- (gtk2:14413): Gtk-CRITICAL **: gtk_text_buffer_get_end_iter: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed
- (gtk2:14413): Gtk-CRITICAL **: gtk_text_buffer_insert: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed
复制代码 求助诸位大牛 , 希望帮帮忙解决这个问题 ,小弟不甚感激!! |
最佳答案
查看完整内容
有两处需要修改: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; v ...
|