Как заставить принудительно обновить wx.Panel?
Вопрос
Я пытаюсь изменить элементы управления Panel, обновить ее и продолжить выполнение кода. Кажется, проблема в том, что Panel ждет простоя, прежде чем обновится. Я, конечно, пробовал обновить, а также 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()
Кто-нибудь еще сталкивался с чем-то подобным? И как ты решил это, если так?
Решение
Вам нужно вызвать Update
.
Другие советы
У меня был StaticBitmap
, который, аналогично, не обновлялся бы ни одним из этих методов (включая Update
, предложенный в принятом ответе). Р>
Я обнаружил, что вызова .Hide ()
и .Show ()
на Panel
было достаточно для обновления изображения. Я подозреваю, что то же самое было бы верно, если бы я запускал функции для объектов более низкого уровня, таких как StaticBitmap
.
Вы можете разместить изменяемую часть панели на подпанелях, например, как это:
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()