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
Frameinhalten während Laufzeit austauschen
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Christian!
Hier habe ich ein Beispiel für dich:
mfg
Gerold
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()
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wie sind oben genannte Panel in ein modul auszulagern? Habe es probiert kriege aber folgende Fehlermeldung:
global name 'MyApp' is not defined.
global name 'MyApp' is not defined.
Zuletzt geändert von ashurial am Montag 18. Juni 2007, 20:25, insgesamt 1-mal geändert.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo ashurial!ashurial hat geschrieben:global name 'MyApp' is not defined.
Das dürfte wohl der falsche Code sein. "MyApp" kommt hier nirgends vor.
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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.