在 Gtk ScrolledWindow 中滚动时应该捕获哪些信号?

fos*_*dom 5 python gtk pygobject gio

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

它看起来像这样:

在此输入图像描述

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

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

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

这并不是我的专业领域 - 我正在寻找实现上述目标的最佳方法的指导。

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

lib*_*rce 4

您应该分析您的应用程序以了解什么需要时间。

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

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

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

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

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

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