linux/gtk程序中的循环图像突然停止显示



我有一个非常简单的Raspberry Pi应用程序。(如果有人关心的话,这是一个儿童博物馆的教育亭。(在python中,我在一个线程中有一个无限循环,从串行端口读取一行。根据输入,我显示14个不同的jpg图像中的一个。我并没有把所有的代码都放在这里,但这是一个非常简单的GDK应用程序。我有一个Arduino向串行端口提供信息,以便在所有图像中循环进行调试。为了响应输入,我做了以下操作:

self.CurrentImage.set_from_file("image.jpg")   # the name here is one of 14

这并不让任何人感到惊讶。但当我让Arduino敲击输入时,屏幕会随机显示一个白色图像,之后什么也没有。我查看了标准输出窗口,数据仍在发送,图像仍在读取中。当我说随机时,我的意思是在输入和显示过程中的某个时刻,它停止显示。没有报告任何错误。有时,在它死之前,我可能会依次得到4-5张图像,或者我可能会在列表中浏览两次。这根本不是确定性的。我的脑海里想着,也许我没有先清理干净,内存泄露了。我做了以下修改:

self.CurrentImage.clear()
self.CurrentImage.set_from_file("image.jpg")

这个问题一直存在。我决定放弃这个方法,去做一些不需要重新加载图像的事情。在启动时,我为每个文件创建了一个单独的GTK图像小部件。然后,为了响应输入数据,我做了以下操作:

self.CurrentImage.hide()
self.CurrentImage = self.AlphaImage # or one of the other 13 Images I created
self.CurrentImage.show()

这种方法的好处是图像显示得更快。第一种方法是在加载图像时使屏幕短暂变白。然而,在随机数目的图像切换之后,窗口再次变为白色。诊断输出显示循环正在愉快地读取数据和选择图像。

在我根据需要加载图像的原始版本中,窗口上只有一个小部件。所以不可能是另一个小部件覆盖了它。第二个版本为每个jpg文件都有一个Image小部件。如果一个覆盖了另一个,我至少应该还能看到那个图像。

我善于跳出框框思考,但我承认Linux对我来说是一个薄弱环节。我会抱怨我在这里承受着时间压力,孩子们会失望的。。。但它本应该在圣诞节前完成,而我昨天才拿到最后一件艺术品。这让我想起了最后一点,也是我认为我的第一种方法失败的原因:我创建了自己的临时图形,即白底黑字。这些图像显示没有问题,直到屏幕保护程序启动。

我愿意接受任何关于如何追踪并修复它的建议。

多亏了Sylvester,我想出了这个。问题不在于我是如何更新图像的,而是我在哪里做的。在线程捕获串行输入的地方是而不是。我将线程简化为简单地读取行,然后做了以下操作:

GLib.idle_add( self.updateImage, lineInput )

然后在函数CCD_ 1中,我进行了选择正确图像和更新的业务逻辑。问题解决了。

最新更新