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();