所以我正在使用一个为名为 Gwyddion 的分析程序编写的工具,这意味着我必须使用Python 2.7。切换到 Python 3 不是一个选择。
我们有一个工具可以进行 AFM 扫描、分析,然后弹出一个带有结果的 Gtk.Window(技术上是 Gtk.Window 子类的子类)。我正在尝试编写一些东西,它需要进行一堆开放的 AFM 扫描,在每个通道的 2 个通道上运行该工具,并对弹出的窗口进行屏幕截图。不幸的是,我遇到了一个问题,由于某种原因,直到在每个通道上运行该工具的循环完成之后,结果才真正显示,所以如果我边走边截屏,我只会得到白色矩形。
我已经查看了带有 GTK 和 PYTHON 标记的每个问题的标题(是的,它们全部是 2k+),但没有发现其他人遇到此问题,所以我认为这是该工具的编写方式的问题,我可以'改变。保持其正常工作比自动截取屏幕截图更重要。
我想也许我可以打开所有窗口,然后循环浏览它们,对每个窗口进行屏幕截图,并在屏幕截图后关闭它们。但我找不到简单地列出所有打开的 Gtk.Windows 的命令,以便我可以循环遍历它们。我觉得我一定错过了一些明显的事情,因为这似乎是一件基本的事情。那么,我如何循环遍历所有打开的 Gtk.Windows,以及如何知道它以哪个顺序循环,以便我可以正确命名屏幕截图?
如果有人对如何使窗口在弹出打开时而不是在循环结束后绘制有想法,我也希望如此,这就是为什么我给出了其他背景,但在这一点上我几乎已经接受了我必须在它们全部打开后循环遍历它们。
可能相关:通过 Gwyddion 与 gtk 交互的方式,我实际上不必运行 gtk.main(),所以这不在我的代码中的任何地方。我其实不知道这是为什么。我只在 Gwyddion 的上下文中使用过 gtk,所以我真的不知道 gtk.main() 是做什么的。
再次强调,关闭 Python 2.7 或更改打开窗口的工具都不是选项。
编辑:我不知道我是如何盯着 list_toplevels() 并没有意识到我所有的 gtk.Windows 都是顶级窗口,但我仍然对这意味着什么感到有点困惑:
“如果要迭代列表并执行涉及可能会破坏小部件的回调的操作,则必须首先调用 g_list_foreach (result, (GFunc)g_object_ref, NULL),然后取消引用所有小部件。”
我正在查看 g_list_foreach 的文档,但无法弄清楚 (GFunc)g_object_ref 指的是什么,或者如何知道它以什么顺序遍历它们。GFunc 会是我的屏幕截图函数吗?我还用谷歌搜索了“gtk unref”,但我不知道“减少引用计数”是什么意思,也不知道为什么有必要。
您可以尝试使用具有列出窗口功能的Wnck。