Frameinhalten während Laufzeit austauschen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Byte
User
Beiträge: 63
Registriert: Dienstag 26. September 2006, 07:04

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
Benutzeravatar
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:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ashurial
User
Beiträge: 5
Registriert: Montag 23. April 2007, 13:18

Wie sind oben genannte Panel in ein modul auszulagern? Habe es probiert kriege aber folgende Fehlermeldung:

global name 'MyApp' is not defined.
Zuletzt geändert von ashurial am Montag 18. Juni 2007, 20:25, insgesamt 1-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ashurial
User
Beiträge: 5
Registriert: Montag 23. April 2007, 13:18

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.
Antworten