Scrolledpanel在创建新面板时会导致滞后/丑陋的闪烁

时间:2012-07-15 22:38:09

标签: wxpython scrollbar panel flicker lag

后台:我的项目有一个工具栏,其按钮会使主面板根据按钮更改为其他部分。所有小组都没有这样做并显示相关的小组;它是通过销毁目前正在进行的任何面板(例如财务)并在其位置重新创建所需的面板(例如收件箱)来完成的。当窗口小部件或分级器花费时间时,重新绘制面板会导致出现丑陋的闪烁。在每个面板的init方法中放入self.Hide()并且不使用Show()直到结束,闪烁减少了大约90%。面板之间的过渡非常顺利,不像平板笔记本那样平滑,但绝对可以接受。

但是:昨天,我将每个面板都更改为Scrolledpanel。我执行它时不需要滚动条,但使用不同屏幕尺寸的人可能会使用几个面板。并且......丑陋的滞后闪烁又回来了!

我不明白这种微小的变化会如何影响这么大。我所做的只是1.用滚动的面板构造函数替换面板构造函数,然后2.添加Setupscrolling命令。

class Tasks_PanelClass(scrolled.ScrolledPanel):
  def __init__(self, parent, id):
    scrolled.ScrolledPanel.__init__(self, parent, id)


    self.Hide()

即使在保持滚动条的滚动窗格上也会发生闪烁。但是我可以看到......伪装的滚动条在一瞬间闪烁,显然程序决定它毕竟不需要它。

所以我怀疑闪烁是由于伪滚动条本身闪烁而引起的.2。它们产生的时间延迟,导致像listctrls这样的所有其他小部件闪烁。

有趣的是,最糟糕和最好奇的闪烁罪魁祸首之一是列表ctrl。它在面板尺寸中的比例是1;另一个小部件有2个。

self.panelsizer.Add(self.lefthandsizer, 2, wx.EXPAND | wx.ALL, 5)
self.panelsizer.Add(self.tasksizer, 1, wx.EXPAND | wx.ALL, 5)

self.SetSizer(self.panelsizer)

self.SetAutoLayout(1)

self.SetupScrolling(scroll_x=True, scroll_y=True)
self.Show()

然而当它闪烁时......它会移动位置!好像它是面板的50%,然后安置在适当的位置。

图片1:
http://ic.pics.livejournal.com/kleio_caissa/886459/232601/600.png 很难在屏幕上看到这个。但是你可以看到粉红色的listctrl正在扩展到它不属于一秒的地方。这些工具是不可见的,但这种类型的闪烁是如此之快,通常不是很明显。但是argh,listctrl !!!!通常它会比这更闪烁,但这就是我能抓住的全部内容。我的手指太快了,但我的眼睛不能错过它,可悲的是。

图2:
链接已删除 结算后的样子。即这是listctrl正确属于的地方!

图片2: http://ic.pics.livejournal.com/kleio_caissa/886459/231775/600.png 在这里你可以看到很多'闪烁'。颜色与隐藏在一切背后的基板相同颜色......所以我猜它是通过?但为什么?它要展示的唯一区域是长垂直线作为边界。

图片4: 链接已删除。

编辑:我只允许两个超链接,所以我选择了两个显示闪烁。要查看显示每个应该如何显示的两个,请尝试使用以下内容替换网址的相关部分: 1. /886459/232200/600.png 2. /886459/232187/600.png

我不明白这一点。我也不明白,即使滚动条在确定它们是否必要时会产生滞后,**为什么这个滞后强度足以覆盖每个面板的init方法中的Hide()命令?当然它应该只显示何时可以显示。 **

我似乎陷入了两难境地:要么让我的程序无法使用,因为没有滚动功能......或者由于丑陋的闪烁使其无法使用。我不能夸大效果的恼人性。 (我还应该补充说,重写程序非常困难,因此面板被隐藏和显示而不是销毁和创建。不是因为时间,而是因为“触发”字符的能力似乎需要面板重新创建,否则由于当时从listctrl查看其配置文件而弹出错误。

我很抱歉所有的tldr,因为我不能真正提供适当的代码,因为它太长而且充满了模块。我真的希望有人知道为什么滚动条似乎会覆盖Hide()命令(或者我在这里误解的原因。再一次,在我将面板类型切换到Scrolledpanel之前,事情一直很愉快。)

如果没有,我会上传一段前后视频,然后尝试制作一个可以重现丑陋效果的示例程序。

额外:我研究了这个并希望这个答案(http://stackoverflow.com/questions/8675017/wxpython-panel-in-existing-window-slow-and-small)能解决,但它似乎没有。我已将SetupScrolling放在init中我能想到的任何地方,它没有任何区别,布局似乎没有。

0 个答案:

没有答案