wxPython方法Freeze使小部件变黑

3
Centos 7.4、Python 3.6.8和wxPython 4.1.0。
import wx
app = wx.App()
myFrame = wx.Frame(None, title="")
myPanel = wx.Panel(myFrame)
myStaticText = wx.StaticText(myPanel, label="Hello World")
mySizer = wx.BoxSizer(wx.VERTICAL)
mySizer.Add(myStaticText, wx.SizerFlags().Center())
myPanel.SetSizer(mySizer)
myFrame.Show()
#myFrame.Freeze()
app.MainLoop()

在运行上述代码时,会出现一个小部件,其中显示文本“Hello World”。然而,如果取消对该行的注释并运行代码,则会显示完全黑色的小部件。为什么这个 Freeze 调用会改变小部件的显示?Freeze 应该防止对小部件显示的任何更新。
依赖项:gtk3-devel、libXtst-devel、libtiff-devel、gcc gcc-c++、epel-release、libGLU-devel。

我没有看到对 myFrame.Thaw() 的调用。 - Igor
这是我能制作的最简单的代码,以展示我的问题,即与Freeze的调用有关,而不是Thaw。在我的完整代码中,我有一个解冻的调用,它将黑色小部件恢复正常。但我的问题是,对Freeze的调用不应该首先使我的小部件变黑。 - Kate
为什么你需要在第一时间调用它呢?正如Vadim所指出的那样,这很少是必需的。 - Igor
我在我的完整代码中使用它,以防止屏幕在冻结时更新。直到我想要屏幕更新时,我才调用Thaw。 - Kate
为什么在 Show() 后面调用 Freeze()?你可以尝试反过来做... - Igor
因为我想冻结一个已经显示的帧。这在Centos7.4和wxPython 3.0.0之前是有效的,但当我更新到Phoenix后,行为发生了变化。 - Kate
1个回答

0

Freeze() 应该在你反复修改小部件时 临时 抑制更新显示,以避免不必要的中间刷新和所导致的闪烁,但小部件 必须 解冻以允许它最终正确地重新绘制。如果保持冻结状态,则将防止其被更新,正如您所观察到的。

通常情况下,您很少需要使用此方法。这是一种优化,绝对不是您必须使用的东西。


我同意,Freeze不应该在调用Thaw之前改变显示,但我的观点是,调用Freeze会将我的部件变成黑色,而不仅仅是暂停当前显示。当小部件被冻结时,我希望它仍然能够显示“Hello World”。 - Kate
重点是您不能让小部件冻结,即您的期望并不是它的工作方式。冻结意味着完全禁止任何重新绘制。 - VZ.
2
@VZ。在Windows中的行为是您所期望的 - 框架会冻结不变。它不会变黑。在CentOS 7.4中,Python 2.7 + wxpython 3.0.0 + gtk2也是如此。只有在CentOS + Python 3.6.8 + gtk3 + wxpython Phoenix中,冻结时变黑的行为才会发生。这是一种新的行为,没有被预期或记录。我亲自测试过。 - user1777820
很抱歉,我不知道如何更好地解释它。冻结一个窗口而不解冻是不被支持的,也不应该这样做。这并不意味着它将在任何地方以相同的方式失败(甚至可能根本不会失败),它只是绝对不能保证能够正常工作,无论定义如何。 - VZ.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接