Seite 1 von 1
Frameinhalten während Laufzeit austauschen
Verfasst: Mittwoch 23. Mai 2007, 19:37
von Byte
Hi,
wie kann man einen bestimmten Frameinhalt während der Programmlaufzeit durch z. B. Button oder Menü Event austauschen.
Konkret, geht es darum, ein wie von Gerold beschriebenes Diagramm gegen ein neues auszutauschen. Hat mir so gut gefallen, dass ich es unbedingt einbauen muss.
Irgendwie schaffe ich es nicht dass es funktioniert. Wenn ich das Diagramm auf ein Panel bastle, dann könnte ich das ganze Panel austauschen, dann muss ich aber den Rest des Frames auf dem neuen Panel nachbauen.
Gibt es evtl. eine Möglichkeit nur ein widget im Frame auszutauschen?
Christian
Verfasst: Sonntag 27. Mai 2007, 10:55
von gerold
Hallo Christian!
Hier habe ich ein Beispiel für dich:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import wx
wx.SetDefaultPyEncoding("iso-8859-15")
class FirstPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, size = (200, 300))
self.SetBackgroundColour("green")
self.SetSizeHints(200, 300)
class SecondPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, size = (300, 400))
self.SetBackgroundColour("yellow")
self.SetSizeHints(300, 400)
class MyFrame(wx.Frame):
def __init__(
self, parent = None, id = -1, title = "Example"
):
wx.Frame.__init__(self, parent, id, title)
panel = wx.Panel(self)
self.panel = panel
vbox_main = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vbox_main)
self.inner_sizer = wx.BoxSizer(wx.VERTICAL)
vbox_main.Add(self.inner_sizer, 0, wx.ALL, 5)
self.inner_panel = FirstPanel(panel)
self.inner_sizer.Add(self.inner_panel, 0, wx.ALL, 5)
btn_change = wx.Button(panel, label = "Change")
vbox_main.Add(btn_change, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)
btn_change.Bind(wx.EVT_BUTTON, self.change_panels)
panel.Fit()
self.Fit()
self.SetSizeHintsSz(self.GetSize())
def change_panels(self, event = None):
self.panel.Freeze()
# Altes Panel aus dem Sizer raus nehmen
self.inner_sizer.Detach(self.inner_panel)
# Austauschen
if isinstance(self.inner_panel, FirstPanel):
self.inner_panel.Destroy()
self.inner_panel = SecondPanel(self.panel)
else:
self.inner_panel.Destroy()
self.inner_panel = FirstPanel(self.panel)
self.inner_sizer.Add(self.inner_panel)
self.SetSizeHints(-1, -1)
self.panel.Fit()
self.Fit()
self.SetSizeHintsSz(self.GetSize())
self.panel.Thaw()
def main():
"""Testing"""
app = wx.PySimpleApp()
f = MyFrame()
f.Center()
f.Show()
app.MainLoop()
if __name__ == "__main__":
main()
mfg
Gerold

Verfasst: Sonntag 17. Juni 2007, 23:24
von ashurial
Wie sind oben genannte Panel in ein modul auszulagern? Habe es probiert kriege aber folgende Fehlermeldung:
global name 'MyApp' is not defined.
Verfasst: Montag 18. Juni 2007, 05:58
von gerold
ashurial hat geschrieben:global name 'MyApp' is not defined.
Hallo ashurial!
Das dürfte wohl der falsche Code sein. "MyApp" kommt hier nirgends vor.
mfg
Gerold

Verfasst: Montag 18. Juni 2007, 07:21
von ashurial
Ja Gerold hast recht, ich habe mich vertan. Die frage bezieht sich auf Deinen Code in
http://www.python-forum.de/topic-8558.h ... ght=frames.