4

我正在为 Rhythmbox 开发一个 python 插件——它包含一个 GtkScrolledWindow 和一个子 GtkIconView。IconView 由 Gtk.TreeModel 提供。

它看起来像这样:

在此处输入图像描述

目前 - 并且有点低效,为树模型中的每一行绘制每个图标 - 每个图标都是来自文件的 GdkPixbuf。如果您有数千行,则整个图标视图可能需要很长时间才能完全更新每个图片图标。

我想要实现的是只更新当前绘图区域中的图标 - 当用户滚动并释放滚动条(或通过键盘导航)时,新绘图区域中的图标应该使用相关图片进行更新。

注意——此时树模型将被完全填充——只有图标不会被加载。

这不是我真正的专业领域 - 我正在寻找我应该用来实现上述目标的最佳方法的指针。

具体来说 - 可以公开哪个 Gtk+3 绘图区域信号(或多个信号)(Gtk.ScrolledWindow / Gtk.IconView ?)编写 python 代码来计算应该更新哪些图标?

4

2 回答 2

4

您应该分析您的应用程序以查看需要时间的内容。

那是加载图像吗?如果是这样,那么加载默认图像并将其添加到视图中的任何位置都足够快,因为您只会加载一个图像。然后,您将根据应出现在视口中的图像,使用idle_add按需加载和更新图像。

如果需要时间将图像添加到模型中,那么您需要通过在 idle_add 回调中检查视口上可见的内容来按需添加。

如果两者都很慢,您需要混合使用两种解决方案:按需加载和添加。

还要考虑一下代理设计模式,它可以用于创建将在后台加载的假封面对象,并包含加载策略。

对于信号,您的 GtkIconView 小部件实现了 GtkScrollable,它解释了如何实现滚动。您可以设置垂直调整并通过连接到其值更改信号来检查它何时发生变化。这意味着用户向上或向下滚动,您需要使用timeout_add启动计时器。如果在短暂的超时(我认为在 0.5 到 1 秒之间,但需要测试)之后,调整没有改变,这意味着用户停止滚动,您可以更新显示的内容。否则,它将在滚动期间更新,从而减慢一切。然后你只需要弄清楚如何找到哪些项目出现在视口中,以更新它们的封面。

虽然我以前从未这样做过,但我对 GTK 有点了解,只是想弄清楚它是如何完成的,所以请谨慎阅读。无论如何,反应性的答案是“按需”。

于 2012-11-09T10:24:37.677 回答
0

但另一方面,如果您必须完全向下滚动,则必须等待构建每个页面。所以我想你应该更好地考虑idle_add事件循环的功能。

这样您的屏幕就不会锁定,您的电脑也不必等待用户加载页面的视图页面。为您和您的应用程序双赢。;-)

于 2012-11-09T00:02:41.020 回答