wxPython: Guter Weg, um eine wx.Panel auf einem vorhandenen wx.Panel zu überlagern
-
06-07-2019 - |
Frage
Ich habe eine wx.Frame, bei dem ein Haupt wx.Panel dort mit mehrer Widgets innerhalb davon. Ich mag eine Schaltfläche in ein „Hilfefenster“, um zu bewirken zu kommen. Dieser Hilfe-Panel wäre wahrscheinlich ein wx.Panel sein, und ich will es den gesamten Haupt wx.Panel (ohne die Menüleiste des wx.Frame) zu überlagern. Es soll eine Art Schließen-Schaltfläche auf der Hilfe-Taste, die es wieder verschwinden werden.
Was ist ein guter Weg, dies zu erreichen? Ich habe in wx.Notebook aussehen, aber nicht einen Weg, um es nicht auf die Registerkarten zeigen.
gefundenBeachten Sie, dass ich möchte nicht jedes Mal die Hilfe-Panel zerstören und neu erstellen der Benutzer schließt und öffnet es. Ich will es nur versteckt werden
Lösung
Es gibt mehrere Möglichkeiten
a) Sie können eine eigene Kindertafel, erstellen und gleiche Größe und Position bei 0,0 unter dem Top alle Kind-Widgets machen. keine Notwendigkeit, es zu zerstören es nur Show / Hide dies auch mit übergeordneten Rahmen passt die Größe
b) popup eine wx.PopupWindow oder abgeleiteten Klasse und Ort und Größe es an den richtigen Standort
, um in ein vorschlagen) ist hier ein Beispiel, in dem alle Bedienelemente in das Panel gesetzt werden Sizer, als separate Hilfe cntrl erstellt wird, die von Taste ein- / ausgeblendet werden können, aber Sie können eine benutzerdefinierte cntrl schaffen, die sich versteckt auf Klick schließen
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()