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. :D

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.