2009-06-23 3 views
5

J'ai un wx.Frame, dans lequel il y a un wx.Panel principal avec plusieurs widgets à l'intérieur. Je veux un bouton pour faire apparaître un "panneau d'aide". Ce panneau d'aide serait probablement un wx.Panel, et je veux qu'il superposer la wx.Panel principale entier (non compris la barre de menu du wx.Frame). Il devrait y avoir une sorte de bouton de fermeture sur le bouton d'aide qui le fera disparaître à nouveau.wxPython: Bonne façon de superposer un wx.Panel sur un wx.Panel existant

Qu'est-ce qu'un bon moyen d'y parvenir? Je l'ai regardé dans wx.Notebook mais ne l'ai pas trouvé un moyen de faire montre pas les onglets.

Notez que je ne veux pas détruire et recréer le panneau d'aide à chaque fois que l'utilisateur ferme et ouvre: Je veux juste qu'il soit caché.

Répondre

11

Il existe plusieurs façons

a), vous pouvez créer un panneau enfant personnalisé, et de le rendre même taille et la position à 0,0 parmi les premiers de tous les widgets enfants. pas besoin de détruire seulement Show/Hide il ce redimensionne aussi avec cadre parent

b) popup de classe wx.PopupWindow ou dérivée et le lieu et la taille au moment de l'emplacement correct

afin Suggest dans a) ici est un exemple, où tous les contrôles sont en panneau à l'aide calibreur, comme cntrl d'aide distinct est créé qui peut être montré/caché bouton, mais vous pouvez créer un cntrl personnalisé qui se cache à cliquer près

import wx 

class MyFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None) 

     self.panel = wx.Panel(self) 

     # create controls 
     self.cntrlPanel = wx.Panel(self.panel) 
     stc1 = wx.StaticText(self.cntrlPanel, label="wow it works") 
     stc2 = wx.StaticText(self.cntrlPanel, label="yes it works") 
     btn = wx.Button(self.cntrlPanel, label="help?") 
     btn.Bind(wx.EVT_BUTTON, self._onShowHelp) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(stc1) 
     sizer.Add(stc2) 
     sizer.Add(btn) 
     self.cntrlPanel.SetSizer(sizer) 


     # create help panel 
     self.helpPanel = wx.Panel(self.panel) 
     self.stcHelp = wx.StaticText(self.helpPanel, label="help help help\n"*8) 
     btn = wx.Button(self.helpPanel, label="close[x]") 
     btn.Bind(wx.EVT_BUTTON, self._onShowCntrls) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.stcHelp) 
     sizer.Add(btn) 
     self.helpPanel.SetSizer(sizer) 
     self.helpPanel.Hide() 
     self.helpPanel.Raise() 
     self.helpPanel.SetBackgroundColour((240,250,240)) 
     self.Bind(wx.EVT_SIZE, self._onSize) 

     self._onShowCntrls(None) 

    def _onShowHelp(self, event): 
     self.helpPanel.SetPosition((0,0)) 
     self.helpPanel.Show() 
     self.cntrlPanel.Hide() 

    def _onShowCntrls(self, event): 
     self.cntrlPanel.SetPosition((0,0)) 
     self.helpPanel.Hide() 
     self.cntrlPanel.Show() 

    def _onSize(self, event): 
     event.Skip() 
     self.helpPanel.SetSize(self.GetClientSizeTuple()) 
     self.cntrlPanel.SetSize(self.GetClientSizeTuple()) 

app = wx.PySimpleApp() 
frame = MyFrame() 
frame.Show() 
app.SetTopWindow(frame) 
app.MainLoop() 
+0

Je pense peut-être que j'ai utilisé le mot "overlay" incorrectement ... Je veux un wx.Panel qui couvrira le wx.Panel principal, le cachant complètement. J'ai essayé de faire ce que vous avez fait, sauf avec un wx.Panel, mais comment puis-je faire s'ajuste toujours en fonction de la taille de la wx.Frame? –

+0

initial set panel = taille du client frame/ou du panneau interne redéfinir le OnSize (EVT_SIZE) et redimensionner l'aide en fonction de la taille de Frame –

+0

ok j'ai mis à jour l'exemple maintenant, il y a deux panneaux un pour cntrl et un pour l'aide, tant à l'interne peut organiser des Cntrls en utilisant calibreurs, et les deux ont bouton pour passer à un autre panneau, ils resize aussi avec cadre parent, cela signifie qu'il a tout ce que vous avez besoin. Mais comme je l'ai dit il y a plusieurs façons de le faire. –

Questions connexes