【问题标题】:Force repaint of wxPython Window, wxmpl plot强制重绘 wxPython 窗口,wxmpl 绘图
【发布时间】:2011-09-21 10:55:08
【问题描述】:

我在刷新 wxPython 窗口时遇到问题。它目前正在使用 wxmpl 绘制一个可以缩放、平移等的图形。有时用户可能会绘制大量数据并放大一小部分,这可能会导致它“冻结”。我的意思是绘图本身没有更新,并且轴标签被绘制在彼此的顶部。它正在修改情节,只是没有正确显示更新的信息。如果您调整窗口大小,则绘图将正确重绘。

我花费了大量时间来挖掘 wx、wxmpl 和 matplotlib 的源代码和文档...我想出的最佳解决方案是调整窗口大小以强制重新绘制(从而显示更新的正确绘制)。

# All of these fail - displays the same, incorrect plot
# (view is a wxmpl.PlotPanel object, which inherits from wx.Window among other things)
view.Refresh()
view.Update()
view.draw()

# This works, but is clearly less than ideal
view.SetSize((view.GetSize().width, view.GetSize().height+1))
view.SetSize((view.GetSize().width, view.GetSize().height-1))

必须有更好的方法——我真正想知道的是 wx.Window.SetSize 做了什么来重绘窗口,然后直接调用它。或者,我是否在某个地方错过了另一种方法?

【问题讨论】:

  • 您究竟是在哪里打这些电话的?如果您在错误的位置调用刷新命令,它将不起作用。我是 wxpython 的普通用户,我确实遇到了和你类似的问题,但是将 widget.Refresh() 调用放在正确的位置总是对我有用。
  • 我在重置窗口中绘图的限制后立即调用它,这是在左键向上事件上。
  • 我正在使用多个 wx.Panel,我 Hide()/Show() 的结果完全相同。只有正确刷新它们的是调整窗口大小。正在使用 window.Layout(),它适用于第一个开关,但不适用于其余开关。

标签: python wxpython wxmpl


【解决方案1】:

panel.Layout() 命令是一个很好的选择,因为它与调整窗口大小时调用的方法完全相同。我也遇到了刷新和更新方法的问题。当这两个失败时,布局似乎工作。

【讨论】:

  • 对此评论 +400。这对 matplotlib 图形有很大帮助。现在它们会在我想要的时候显示!
  • 这太棒了。我一直有同样的问题,panel.Layout() 解决了它。我不知道为什么 matplotlib 不喜欢 Refresh() 或 Update()。嗯……谢谢!
【解决方案2】:

如果你不能把它放在其他地方,你可以试试

wx.Yield()

而不是RefreshUpdate

【讨论】:

  • 这也不起作用 - 与 RefreshUpdate 处理相同:(
【解决方案3】:

我也会在 PlotPanel 上尝试 Show(False) 然后 Show(True)。

【讨论】:

    【解决方案4】:

    在计算量大的应用程序中,您希望计算时间超过 0.1 秒并且可能有一些用户输入,因此通常不建议在 GUI 线程中进行那些密集的绘图。

    不了解您的具体情况,但如果您将所有耗时的任务(无论是计算、图像调整(例如缩放))移动到非 GUI 线程,则可以采用一般方法。只是一个普通的 Python 线程就可以了,一旦你完成了很长的部分,你就可以刷新你的 GUI。当然,在计算过程中,显示​​某种“等待”标志是对用户友好的。同时禁用其他控件,这样无聊的用户将无法在计算中途更改任何内容。

    从我早期使用 Java 和后来使用 Python 开始,我就一直被这个问题困扰,主要是与网络操作有关(绝不应该在 GUI 线程中)。

    如果是图像调整(或图形生成),需要花费大量时间,后台线程可以在 wxMemoryDC 中准备图像,然后 wxDC::Blit 将其粘贴到您选择的窗口中。我不知道这是否可以使用您的组件 wxmpl.PlotPanel 完成,因此您必须对此进行研究。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2015-12-27
      • 2011-02-11
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多