如何强制刷新 wx.Panel?

10 投票
4 回答
33626 浏览
提问于 2025-04-15 13:23

我正在尝试修改一个面板的控件,让它更新,然后继续执行后面的代码。问题是,这个面板似乎在等待空闲状态(Idle)才会自己刷新。我当然试过刷新面板,也用过 GetSizer().Layout(),甚至还用 SendSizeEvent() 方法给框架发送了一个调整大小的事件,但都没有效果。我对此感到很困惑,真不敢相信没有办法强制重新绘制这个面板。以下是我用来修改控件的代码:

def HideButtons(self):
        self.newButton.Show(False)
        self.openButton.Show(False)
        self.exitButton.Show(False)
        self.buttonSizer.Detach(self.newButton)
        self.buttonSizer.Detach(self.openButton)
        self.buttonSizer.Detach(self.exitButton)
        loadingLabel = wx.StaticText(self.splashImage, wx.ID_ANY, "Loading...", style=wx.ALIGN_LEFT)
        loadingLabel.SetBackgroundColour(wx.WHITE)
        self.buttonSizer.Add(loadingLabel)
        self.GetSizer().Layout()
        self.splashImage.Refresh()

有没有人遇到过类似的情况?如果有,你是怎么解决的呢?

4 个回答

2

你可以把面板中可变的部分放在子面板里,比如这样:

def MakeButtonPanels(self):
    self.buttonPanel1 = wx.Panel(self)
    self.Add(self.buttonPanel1, 0, wxALL|wxALIGN_LEFT, 5)
    # ... make the three buttons and the button sizer on buttonPanel1

    self.buttonPanel2 = wx.Panel(self)
    self.Add(self.buttonPanel2, 0, wxALL|wxALIGN_LEFT, 5)
    # ... make the loading label and its sizer on buttonPanel2

    self.buttonPanel2.Show(False) # hide it by default

def HideButtons(self):
    self.buttonPanel1.Show(False)
    self.buttonPanel2.Show(True)
    self.Layout()
4

我有一个 StaticBitmap,它也不管用这些方法(包括接受的答案中提到的 Update)都无法更新。

我发现只要在 Panel 上调用 .Hide().Show(),就能刷新图片。我猜如果我对一个更底层的对象,比如 StaticBitmap,执行这些操作,效果也会一样。

13

你需要调用一下 Update 这个方法。

撰写回答