【问题标题】:wxPython method Freeze turns widget blackwxPython 方法 Freeze 将小部件变为黑色
【发布时间】:2021-02-23 21:20:10
【问题描述】:

Centos 7.4, 蟒蛇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 调用会改变小部件的显示?冻结应该防止对小部件显示进行任何更新。

依赖:gtk3-devel、libXtst-devel、libtiff-devel、gcc gcc-c++ epel-release、libGLU-devel

【问题讨论】:

  • 我没有看到对myFrame.Thaw()的呼叫。
  • 这是我可以编写的最简单的代码来显示我的问题,即调用 Freeze,而不是 Thaw。在我的完整代码中,我调用了 thaw,这会将黑色小部件恢复正常。但我的问题是,对 Freeze 的调用不应该首先将我的小部件变成黑色。
  • 为什么首先需要调用它?正如 vadim 指出的那样,这很少需要。
  • 我在我的完整代码中使用它以防止屏幕在冻结时更新。直到我想要更新屏幕,我称之为 Thaw。
  • 你为什么在Show()之后打电话给Freeze()?你可以试着反过来做......

标签: wxpython wxwidgets gtk3 freeze-thaw


【解决方案1】:

Freeze() 应该暂时在您反复修改小部件时禁止更新显示,以避免不必要的中间刷新和由此产生的闪烁,但小部件必须 解冻以使其最终正确重绘。正如您所观察到的,将其冻结将阻止其更新。

通常情况下,您很少(如果有的话)需要使用此方法。这是一种优化,绝对不是您曾经必须使用的东西。

【讨论】:

  • 我同意,在调用 Thaw 之前,Freeze 不应更改显示,但我的意思是,对 Freeze 的调用将我的小部件变为黑色,而不是仅仅暂停显示所在的位置。我希望小部件在冻结时仍然显示“Hello World”。
  • 关键是你不能让一个小部件冻结,即你的期望不是它是如何工作的。冻结意味着完全禁止任何重绘。
  • @VZ。 Windows 中的行为是您所期望的 - 框架按原样冻结。它不会变黑。与 CentOS 7.4 中的 Python 2.7 + wxpython 3.0.0 + gtk2 相同。冻结时变黑的行为只发生在 CentOS + Python 3.6.8 + gtk3 + wxpython Phoenix 中。这是一种没有预料到或记录在案的新行为。我自己测试过。
  • 对不起,我不知道如何更好地解释它。不支持冻结窗口而不解冻,也不应该这样做。这并不意味着它会在任何地方以相同的方式失败(甚至完全失败),它只是意味着它绝对不能保证工作,对于任何“工作”的定义。
猜你喜欢
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多