【问题标题】:Gtk-CRITICAL **: IA__gtk_widget_get_parent: assertion `GTK_IS_WIDGET (widget)' failedGtk-CRITICAL **:IA__gtk_widget_get_parent:断言“GTK_IS_WIDGET(小部件)”失败
【发布时间】:2013-09-12 08:40:28
【问题描述】:

我正在尝试访问GTK Widget,现在小部件的任何属性都可以,但我不断收到错误消息:

Gtk-CRITICAL **: IA__FUNCTIONAME: assertion `GTK_IS_WIDGET (widget)' failed

到目前为止,这是我的代码,以及相关位:

///////// FILE 1 /////////////////

GtkWidget *textbox1;                        //declared at the top of the file 
GtkTextBuffer *text;

void onscreen (int type, char* key)
{
    if (type == -1) {
        //remove widget
    } 
    else if (type == 1) {
        gtk_widget_destroy(GTK_WIDGET(textbox1));     
        //THE OFFENDING LINE  ^^^
    }
}

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

    /*more code*/

    textbox1 = gtk_text_view_new();
    text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textbox1));
    GtkTextIter iter;
    gtk_text_buffer_get_iter_at_offset(text, &iter, 0);
    gtk_text_buffer_insert(text, &iter, "plain text\n", -1); 

    vbox = gtk_vbox_new(FALSE, 8);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), zbarwidgets, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(results), FALSE, FALSE, 0);

    gtk_widget_show_all(window);
    gtk_main();
    return(0);
}

///////// FILE 1 /////////////////

然后我在另一个文件中有更多代码(包括标题等...很好),它调用文件 2 中的第一个函数,如下所示:

///////// FILE 2 /////////////////

static inline int window_draw (window_t *w) {
    /* do some stuff */
    onscreen(1, sym->data);
    /* do some stuff */
}

///////// FILE 2 /////////////////

谢谢!

【问题讨论】:

  • 你为什么用gdk_threads_
  • @drahnr 我在程序使用线程之前使用它,做了一些更改但忘记删除这些,现在已经这样做了
  • 当您进入onscreen 时,堆栈跟踪是什么样的?
  • @JoachimIsaksson 抱歉,请稍等,在进入 GDB 之前我必须设置一些标志,所以我在获取堆栈跟踪时遇到了一些麻烦

标签: c user-interface gtk


【解决方案1】:

您的错误不在上面显示的代码中,其他一些函数确实修改了textbox1

另请注意,gtk_widget_get_parent 将始终根据显示的代码返回 NULL

你为什么要使用gdk_threads_* 除非你真的遇到线程问题 - 也不是它被弃用(afaik),否则不要这样做。

【讨论】:

  • 你是什么意思一些“其他功能”修改了textbox1,我对gtk_widget_get_parent在代码中的这一点不感兴趣我实际上试图destroy小部件但由于错误即将推出我尝试了不同的功能,但仍然得到相同的东西,我已更改代码以提供更多上下文,从 gtk_widget_get_parentgtk_widget_destroy 但我仍然得到相同的错误
  • 我打赌/*more code*/ 包含对onscreen(...) 的调用,这是您遇到麻烦的根本原因。贴出你的完整代码,没意义。
  • 注意我已经添加了线程,因为没有它,程序在任何时候完成任何绘图都会崩溃
  • 尝试在gtk_init() 之后执行textbox1 = gtk_text_view_new(); - 如果这不起作用,请尝试删除代码,直到问题消失。另外 - 再次 - 你没有发布完整的代码,而是另一个块。从代码 postet 不清楚为什么你需要gdk_threads_*-calls。
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多