我在让我的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重绘窗口的方式,而只是调用它。或者,是否有其他方法我错过了某个地方?
答案 0 :(得分:3)
panel.Layout()命令是一个很好的选项,因为它与调整窗口大小时调用的方法完全相同。我也遇到了刷新和更新方法的问题。当这两个失败时,布局似乎有效。
答案 1 :(得分:1)
如果您无法将其放置在其他地方,可以尝试
wx.Yield()
而不是Refresh
或Update
。
答案 2 :(得分:1)
我还会尝试在PlotPanel上显示Show(False)然后显示Show(True)。
答案 3 :(得分:0)
在计算量很大的应用程序中,您希望计算某些内容的时间超过0.1秒并且可能有一些用户输入,因此通常不建议在GUI线程中进行那些强烈的绘制。
不了解您的具体情况,但如果您将所有耗时的任务(无论是计算,图像调整(例如缩放))移动到非GUI线程,都不会知道。只需一个普通的Python线程即可,一旦完成了很长的部分,就可以刷新GUI。在计算过程中,显示某种“等待”标志对用户友好。同时禁用其他控件,这样无聊的用户将无法在计算中途改变任何内容。
自从我早期使用Java以及稍后使用Python以来,我一直坚持这个问题,主要是与网络操作有关(绝不应该在GUI线程中)。
如果是图像调整(或图形生成),这需要花费很多时间,后台线程可以在wxMemoryDC中准备图像,然后wxDC ::将它Blit到您选择的窗口。我不知道你的组件wxmpl.PlotPanel是否可以这样做,所以你必须研究它。