¿Cómo se fuerza la actualización de un wx.Panel?
Pregunta
Estoy intentando modificar los controles de un Panel, actualizarlo y luego continuar con la ejecución del código. El problema parece ser que el Panel está esperando a Idle antes de que se actualice. Intenté actualizar, por supuesto, así como GetSizer (). Layout () e incluso envié un evento de cambio de tamaño al marco utilizando el método SendSizeEvent (), pero fue en vano. Estoy perdido aquí, me resulta difícil creer que no hay forma de forzar un rediseño de este panel. Aquí está el código que cambia los controles:
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()
¿Alguien más ha encontrado algo como esto? ¿Y cómo lo resolvió si es así?
Solución
Debe llamar a Actualizar
método.
Otros consejos
Tenía un StaticBitmap
que, de manera similar, no se actualizaría con ninguna de estas técnicas (incluida la Update
sugerida en la respuesta aceptada).
Descubrí que llamar a .Hide ()
y .Show ()
en el Panel
era suficiente para actualizar la imagen. Sospecho que lo mismo sería cierto si hubiera ejecutado las funciones contra un objeto de nivel inferior como el StaticBitmap
.
Puede colocar la parte mutable de su panel en subpaneles, p. así:
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()