【问题标题】:GTK text entry updating programmatically以编程方式更新 GTK 文本条目
【发布时间】:2015-08-11 23:07:57
【问题描述】:

我想更新按键事件的文本条目。

我的场景没有键盘,所以我以编程方式生成它 并尝试从按键事件处理程序更新文本条目。

每次按键时,我都需要更新 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();
}

【问题讨论】:

  • gtk_entry_set_text 是正确的 API。获得分段错误意味着entry1 不是GtkEntry * 实例或buffer 不是以NUL 结尾的字符串:就是这么简单。
  • 用代码修改的问题。缓冲区是从另一个线程填充的
  • @tuxtux buffer 在哪里?它是如何声明的?你还没有表现出来。从不同的线程进行更新听起来非常可怕。尝试在调用中使用常量(字符串文字)而不是 buffer,看看是否可行。
  • 您发布的内容没有显示问题:您应该制作一个最小的自包含测试用例。
  • 也尝试了“ok”示例字符串而不是缓冲区(以避免外部线程怀疑)。但结果是一样的。

标签: c gtk gtk2 gtkentry


【解决方案1】:

你从来没有从你的 GtkBuilder 分配 entry1 变量,所以entry1 在信号发生时仍然是NULL,程序崩溃了。你这样做是为了window;为entry1 做类似的事情。

【讨论】:

    猜你喜欢
    • 2015-03-27
    • 2014-07-17
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多