2009-08-05 4 views
9

J'essaie de modifier les contrôles d'un Panel, de le mettre à jour, puis de continuer avec l'exécution du code. Le problème semble être que le Panel attend l'inactivité avant de se rafraîchir. J'ai essayé l'actualisation bien sûr, ainsi que GetSizer(). Layout() et même envoyé un événement de redimensionnement à l'image en utilisant la méthode SendSizeEvent(), mais en vain. Je suis perdu ici, je trouve difficile de croire qu'il n'y a aucun moyen de forcer un redessin de ce panneau. Voici le code qui change les contrôles:Comment forcer l'actualisation d'un wx.Panel?

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() 

Est-ce que quelqu'un d'autre a rencontré quelque chose comme ça? Et comment l'avez-vous résolu si oui?

+0

Avez-vous essayé 'self.Show()'? –

Répondre

13

Vous devez appeler la méthode Update.

+3

'Update()' seul n'a pas aidé dans mon cas ('StaticBitmap's dans un' GridSizer' sur un 'Panel'), mais les docs ont dit' Refresh() ' déclencherait un repeindre inconditionnel - ce qu'il a fait quand il a été suivi par 'Update()' – virtualnobi

+0

En fait, juste 'Refresh()' fonctionne pour moi !? – GreenAsJade

+0

Phoenix a modifié la structure du lien doc. 'Update' [a été déplacé] (https://wxpython.org/Phoenix/docs/html/wx.Window.html?highlight=wx.window#wx.Window.Update). C'est exactement ce que je cherchais. Merci! –

1

Vous pouvez placer la partie modifiable de votre panneau sur des sous-panneaux, par ex. comme ceci:

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() 
+0

C'est la partie cachée et montrant qui n'exécutait pas – Fry

4

J'avais un StaticBitmap qui, de même, ne serait pas mis à jour par l'une de ces techniques (y compris le Update suggéré dans la réponse acceptée).

J'ai trouvé que l'appel .Hide() et .Show() sur le Panel était suffisant pour actualiser l'image. Je soupçonne que la même chose serait vraie si j'avais exécuté les fonctions contre un objet de niveau inférieur comme le StaticBitmap.

Questions connexes