python - 在 Gtk ScrolledWindow 中滚动时我应该捕捉什么信号?

标签 python gtk pygobject gio

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

看起来像这样:

enter image description here

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

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

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

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

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

最佳答案

您应该对您的应用程序进行概要分析以了解需要时间的地方。

那是加载图像吗?如果是,那么加载默认图像并将其添加到 View 中的任何位置就足够快了,因为您只加载了一张图像。然后,您将使用 idle_add 按需加载和更新图像,基于应出现在视口(viewport)中的图像。

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

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

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

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

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

关于python - 在 Gtk ScrolledWindow 中滚动时我应该捕捉什么信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299858/

相关文章:

multithreading - 如何使用多进程或多线程客户端在 python 中获取工作进度条?

python - 如何使用 NumPy 将 sRGB 格式转换为 NV12 格式?

c - 在新窗口中从 GTKEntry 获取整数

c - 在 GTK 回调中发送数据

linux - Glade 和 GTK : which version to choose?

python - pyGObject 透明游标

python-3.x - PyGObject. Python 与 GTK。 TreeView 问题

python - 通过 alembic 脚本并发数据库表索引

python - 将 sys.arvg 与列表进行比较

python - 如何在 MAMP 堆栈中将 Django 与 MySQL 一起使用?