Gtk&x2B;没有正确更新小部件

Gtk&x2B;没有正确更新小部件,gtk,gtk3,archlinux,Gtk,Gtk3,Archlinux,我希望我能很好地描述这个问题。几天前我运行了pacmansyu,我正在使用的GTK应用程序停止正常工作。之后我又运行了一次,但问题仍然存在 基本上,程序没有正确响应。例如,我有一个按钮,按下该按钮时,应将“aqui”打印到控制台,然后向上移动画布(如中所示,向上导航)。但是,画布不会更新,输出也不会打印。只有当我关闭应用程序时,我按下按钮时,“aqui”才会被打印 当另一个窗口打开时,应用程序似乎会响应。如果我点击一个按钮打开一个不同的窗口,累积的更改就会生效(打印了多个“aqui”,画布向上移

我希望我能很好地描述这个问题。几天前我运行了
pacmansyu
,我正在使用的GTK应用程序停止正常工作。之后我又运行了一次,但问题仍然存在

基本上,程序没有正确响应。例如,我有一个按钮,按下该按钮时,应将“aqui”打印到控制台,然后向上移动画布(如中所示,向上导航)。但是,画布不会更新,输出也不会打印。只有当我关闭应用程序时,我按下按钮时,“aqui”才会被打印

当另一个窗口打开时,应用程序似乎会响应。如果我点击一个按钮打开一个不同的窗口,累积的更改就会生效(打印了多个“aqui”,画布向上移动的次数与我点击的次数相同)。当我点击应该关闭新窗口的按钮时,按钮消失了,但窗口仍然存在。例如:

这是向上按钮的代码:

static gboolean moveUp(GtkWidget *widget, GdkEventButton *event,
    gpointer user_data)
{
    windowData->moveY(STEP);
    gtk_widget_queue_draw((GtkWidget*) user_data);
    std::cout << "aqui";
    return TRUE;
}
单击确定按钮时调用的旋转视图方法:

static gboolean rotateW(GtkWidget *widget, GdkEventButton *event,
    gpointer user_data)
{
  double angle = atof(gtk_entry_get_text(GTK_ENTRY(rotationAngle)));
  windowData->rotate(angle);

  displayFile->rotateAll(windowData->getAngle(), windowData->getCenter());

  gtk_widget_destroy((GtkWidget*) user_data);
  return TRUE;
}
以及
main
方法:

int main(int argc, char **argv)
{
    GtkWidget       *viewport, *buttonUp,
     *buttonDown,   *buttonLeft, *buttonRight, *buttonZoomIn,
     *buttonZoomOut, *newLine, *listWindow, *mainBox, *buttonClose,
     *newPolygon, *newPoint, *translateButton, *scaleButton, 
     *rotateButton, *rotateWindowButton;
    GtkDrawingArea  *drawingArea;
    GError          *error = NULL;

    origin.x = 0;
    origin.y = 0;

    viewportData = new Viewport(300.0, 350.0);
    windowData = new Window(300.0, 350.0);
    sh = new SutherlandHodgeman(windowData);
    cs = new CohenSutherland(windowData);
    nc = new NoClipping(windowData);
    clipper = nc;

    displayFile = new DisplayFile(); 

    Polygon* l = new Polygon("line");
    l->addPoint(0, 0);
    l->addPoint(100, 0);
    displayFile->add(l);

    //l = new Polygon("line2");
    //l->addPoint(5, 5);
    //l->addPoint(500, 15);
    //displayFile->add(l);

    /* Init GTK+ */

    gtk_init( &argc, &argv );

    /* Create new GtkBuilder object */
    mainBuilder = gtk_builder_new();

    /* Load UI from file. If error occurs, report it and quit application.
     * Replace "tut.glade" with your saved project. */
    if( ! gtk_builder_add_from_file( mainBuilder, "interface.glade", &error ) )
    {
        g_warning( "%s", error->message );
        g_free( error );
        return 1;
    }

    /* Get main window pointer from UI */
    mainWindow = GTK_WIDGET( gtk_builder_get_object( mainBuilder, "mainWindow" ) );
    viewport = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "viewport"));
    drawingArea = GTK_DRAWING_AREA(gtk_builder_get_object(mainBuilder, "drawingArea"));
    listWindow = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "listWindow"));
    buttonClose = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "buttonClose"));
    mainBox = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "mainBox"));
    buttonUp = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "buttonUp"));
    buttonLeft = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "buttonLeft"));
    buttonRight = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "buttonRight"));
    buttonDown = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "buttonDown"));
    buttonZoomIn = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "zoomIn"));
    buttonZoomOut = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "zoomOut"));
    translateButton = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "translateButton"));
    scaleButton = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "scaleButton"));
    rotateButton = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "rotateButton"));
    newPolygon = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "newPolygon"));
    newLine = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "newLine"));
    newPoint = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "newPoint"));
    cohenButton = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "cohenButton"));
    sutherlandButton = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "hodgemanButton"));
    noClippingButton = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "noClipping"));
    rotateWindowButton = GTK_WIDGET(gtk_builder_get_object(mainBuilder, "rotateWindow"));

    g_signal_connect(mainWindow, "delete_event", G_CALLBACK(exit_app), NULL);
    g_signal_connect(buttonClose, "clicked", G_CALLBACK(exit_app), NULL);
    g_signal_connect(G_OBJECT(drawingArea), "draw", G_CALLBACK(on_draw_event), NULL); 
    g_signal_connect(G_OBJECT(buttonUp), "clicked", G_CALLBACK(moveUp), mainWindow);
    g_signal_connect(G_OBJECT(buttonDown), "clicked", G_CALLBACK(moveDown), mainWindow);
    g_signal_connect(G_OBJECT(buttonLeft), "clicked", G_CALLBACK(moveLeft), mainWindow);
    g_signal_connect(G_OBJECT(buttonRight), "clicked", G_CALLBACK(moveRight), mainWindow);
    g_signal_connect(G_OBJECT(buttonZoomIn), "clicked", G_CALLBACK(zoomIn), mainWindow);
    g_signal_connect(G_OBJECT(buttonZoomOut), "clicked", G_CALLBACK(zoomOut), mainWindow);
    g_signal_connect(G_OBJECT(translateButton), "clicked", G_CALLBACK(translateWindow), mainWindow);
    g_signal_connect(G_OBJECT(rotateButton), "clicked", G_CALLBACK(rotateWindow), mainWindow);
    g_signal_connect(G_OBJECT(scaleButton), "clicked", G_CALLBACK(scaleWindow), mainWindow);
    g_signal_connect(G_OBJECT(newLine), "clicked", G_CALLBACK(newLineWindow), NULL);
    g_signal_connect(G_OBJECT(newPolygon), "clicked", G_CALLBACK(newPolygonWindow), NULL);
    g_signal_connect(G_OBJECT(newPoint), "clicked", G_CALLBACK(newPointWindow), NULL);
    g_signal_connect(G_OBJECT(cohenButton), "clicked", G_CALLBACK(changeClipping), mainWindow);
    g_signal_connect(G_OBJECT(sutherlandButton), "clicked", G_CALLBACK(changeClipping), mainWindow);
    g_signal_connect(G_OBJECT(noClippingButton), "clicked", G_CALLBACK(changeClipping), mainWindow);
    g_signal_connect(G_OBJECT(rotateWindowButton), "clicked", G_CALLBACK(rotateWindowWindow), mainWindow);
    /* Connect signals */
    gtk_builder_connect_signals( mainBuilder, NULL );

    /* Destroy builder, since we don't need it anymore */
    //g_object_unref( G_OBJECT( mainBuilder ) );

    /* Show window. All other widgets are automatically shown by GtkBuilder */
    gtk_widget_show_all( mainWindow );

    /* Start main loop */
    gtk_main();

    return 0;
}
如果这还不够,则启用完整代码。我提前道歉,代码乱七八糟


编辑

std::endl
添加到
std::cout
的末尾,解决了字符串无法实时打印的问题。现在,当我按下按钮时,它们会被打印出来,但是按钮的其他功能,即影响界面的功能,在另一个窗口打开之前仍然不会更新


编辑2

我尝试将gtk从3.20.6降级到3.16.1,但没有成功。我还尝试将每个包降级(编辑
/etc/pacman.conf
,然后运行
pacman-Syyuu
)到2016年3月30日,但也没有成功

我还尝试删除
gtk main()
的其他实例,但没有成功

刚刚尝试添加此代码:

if(gtk_events_pending())
    gtk_main_iteration();

哪种力一次运行主回路。这也没有解决问题。

您可能希望强制GTK刷新其挂起的操作

我用python这样做:

while gtk.events_pending():     #   this forces GTK to refresh the screen
    gtk.main_iteration()        
由于您没有提到您正在使用的语言,您必须找出如何复制此语言,但它可能只是

 while gtk.events_pending():     #   this forces GTK to refresh the screen
    gtk.main_iteration();

你的问题是你打了两次电话。在main(这是正常的)和
rotatewindoww
函数中(这是错误的)。这样做将创建一个新的主循环,在该循环中,您将被卡住,直到退出


只需删除那个额外的呼叫就足以解决您的问题。

您检查过pacman日志吗?@oldtechaa我在日志中查找什么?没有错误,至少清楚地知道更新了什么。pacman更新上的巧合问题看起来像是打包或上游软件中的错误。但是,如果不查看日志,我们就无法了解包是什么。我只是对您的答案投了否决票,因为从代码OP中可以清楚地看出,他没有使用Python,而您的答案是,您没有解释为什么会使用此帮助OP。(代码中的注释根本没有解释代码)@B8vrede:我刚刚编辑了答案。这就是OP正在搜索的内容。我认为你是对的,最近发布在这里的大多数问题都与GTK无法完成其主要迭代有关,在这种情况下,这是一个有效的答案。:)我用这个解决了很多问题。现在,他决定了他希望GTK在哪里进行刷新。虽然他们没有明确地指定语言,但是你可以从代码样本中看出它是C或C++。嘿,谢谢,我试过了,但是它没有用。我在帖子中添加了一些信息,并尝试了一些东西
 while gtk.events_pending():     #   this forces GTK to refresh the screen
    gtk.main_iteration();