【问题标题】:Excessive hang time when destroying a PyGTK window销毁 PyGTK 窗口时挂起时间过长
【发布时间】:2013-01-03 21:20:03
【问题描述】:

我的 PyGTK 应用程序创建了一个用于显示结果预览的辅助弹出窗口。这个窗口相当精致,表格小部件嵌套三层,并由 HBox 填充,每个 HBox 在最低级别包含一个标签。标签的总数可以是数千个。我注意到,当我关闭此窗口时,GTK 变得非常忙于处理某些事情(使用 gobject.idle_add 添加的函数在超过 10 秒内无法解析),并且我的应用程序的主窗口此时变得无响应。即使有这么多的小部件,我觉得关闭窗口需要这么长时间,甚至比设置和显示时间还要长,这让我感到很奇怪。有什么办法可以减轻这种情况吗? (我尝试在另一个线程中创建和显示窗口,但显然使用 GTK 这是不行的)

【问题讨论】:

  • 使用分析器找出哪些函数需要这么长时间。
  • 也许你可以先隐藏窗口,然后通过idle_add进行销毁。但无论如何,它一定不会那么长。这里出现了严重的问题。测量它!
  • 在总共 61.654 秒的执行时间中(包括它等待我输入的一小段时间),47.945 秒用于 gtk._gtk.main,8.347 秒用于 gtk.Widget.show_all,和 gtk.Container.add 中的 2.587。设置和显示窗口大约需要 11 秒(在 show_all 和 add 中花费的时间),以及 44 秒(gtk._gtk.main 时间,减去等待输入所花费的时间)来销毁它。另外,我显然很不擅长估计时间。

标签: python gtk


【解决方案1】:

显示该窗口需要多长时间?显示时是否一次创建所有小部件?

您的问题可能是由于您的数千个小部件同时被破坏而引起的。或者通过对这些小部件的破坏执行长时间的操作。但是没有一些代码可以看,可能有成千上万的原因,所以一个番茄说,使用分析器......

【讨论】:

  • 正如我所料,几乎所有设置和拆除窗口的时间都花在了 gtk 方法中。不知道除了使用更少的小部件之外,是否有任何方法可以节省时间或防止它长时间阻塞,这不是一个真正的选择。显示中总共有大约 4000 个小部件,变成 4000 个 Label 和 4000 个 HBox 来打包。
  • 如果您使用 4000 个标签和 4000 个 HBox,您的问题很可能不是性能,而是 UI 设计。是否有可能获得 UI 的屏幕截图(甚至是部分截图)?了解你为什么这样做?顺便说一句,如果您经常需要重新打开该窗口,请不要关闭它,使用 gtk_widget_hide_on_delete 将其隐藏。创建仍然会很长,但重用窗口并用新数据填充它会比再次销毁+创建更快。
  • 这是一个已写入的 .tsv 文件的预览,可以在 Excel 中打开和编辑。单元格的数量完全取决于用户指定的内容——我只是认为相对于单元格的数量来说它似乎花费了太长时间。
  • 您的问题是您通过使用错误的小部件来滥用工具包。电子表格不是数千个小部件的集合,它通常是针对此用途优化的单个小部件。请看一下这个问题:Embed a spreadsheet/table in a PyGTK application?.
【解决方案2】:

显然,这是由于我试图更改表格的背景颜色引起的——我正在设置每个 HBox(和标签)的背景颜色,这几乎是所有过度拆卸时间的原因。我所要做的就是设置包含表格的视口的背景颜色。

【讨论】:

  • 如上所述,真正的问题是您使用了错误的小部件。
  • 切换到使用 TreeView。之前的表现还不错,现在好像好多了。
猜你喜欢
  • 2014-12-01
  • 2010-10-31
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2020-02-22
  • 2011-01-18
相关资源
最近更新 更多