[Solved] Suche ein Deck-Window

Plattformunabhängige GUIs mit wxWidgets.
Antworten
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Sonntag 4. Mai 2008, 18:13

Hi,

Ich brauche für eine Applikation von mir ein soganntes Deck-Window/Widget. In XUL wäre das http://developer.mozilla.org/en/docs/XUL:deck. Anzeigen können muss es Panels. Gibt es sowas schon fertig in wx, oder muss ich mir selbst ein Window dafür schreiben (Ich habe nämlich noch nichts gefunden, was mir passend erscheint). In der vorhandenen Qt-Version ist das ganze mit einem QWorkspace (Mdi-Window) gelöst; ist aber eher ein Overkill, da man nur immer das oberste Window sehen muss/darf. Ein Notebook wäre wenn ich nichts übersehe schon passend, allerdings müsste ich die Tabs ausblenden können...

Thx, apollo13

P.S.: Ich warte noch immer auf mein "wxpython in action" buch :/
Zuletzt geändert von apollo13 am Dienstag 6. Mai 2008, 15:23, 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:

Sonntag 4. Mai 2008, 19:26

Hallo apollo13!

Du kannst Panels unsichtbar machen. Immer wenn ein bestimmtes Panel angezeigt werden soll, machst du dieses eine Panel sichtbar und die anderen Panels unsichtbar.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Dienstag 6. Mai 2008, 11:19

Und wohin pack ich dann die ganzen Panels; einfach in einen BoxSizer etwa? Das würde dann heißen, dass die ganzen Panels im Size sind, allerdings hidden.

Thx, apollo13
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 6. Mai 2008, 11:56

apollo13 hat geschrieben:Und wohin pack ich dann die ganzen Panels; einfach in einen BoxSizer etwa? Das würde dann heißen, dass die ganzen Panels im Size sind, allerdings hidden.
Hallo apollo13!

Ja.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-15")


class MyFrame(wx.Frame):
    
    def __init__(
        self, parent = None, title = "Example", size = wx.Size(550, 420)
    ):
        wx.Frame.__init__(self, parent, -1, title, size = size)
        
        main_panel = wx.Panel(self)
        self.main_panel = main_panel
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        main_panel.SetSizer(vbox)
        
        # Buttons
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vbox.Add(hbox, 0, wx.EXPAND | wx.ALL, 5)
        
        btn_show_all = wx.Button(main_panel, label = "alle anzeigen")
        hbox.Add(btn_show_all, 0, wx.ALL, 5)
        btn_show_all.Bind(wx.EVT_BUTTON, self.show_all)
        
        btn_show_panel1 = wx.Button(main_panel, label = "zeige Panel 1")
        hbox.Add(btn_show_panel1, 0, wx.ALL, 5)
        btn_show_panel1.Bind(wx.EVT_BUTTON, self.show_panel1)
        
        btn_show_panel2 = wx.Button(main_panel, label = "zeige Panel 2")
        hbox.Add(btn_show_panel2, 0, wx.ALL, 5)
        btn_show_panel2.Bind(wx.EVT_BUTTON, self.show_panel2)
        
        btn_show_panel3 = wx.Button(main_panel, label = "zeige Panel 3")
        hbox.Add(btn_show_panel3, 0, wx.ALL, 5)
        btn_show_panel3.Bind(wx.EVT_BUTTON, self.show_panel3)
        
        # Panels
        panel1 = wx.Panel(main_panel)
        panel1.SetBackgroundColour("green")
        vbox.Add(panel1, 1, wx.ALL | wx.EXPAND, 5)
        self.panel1 = panel1
        
        panel2 = wx.Panel(main_panel)
        panel2.SetBackgroundColour("red")
        vbox.Add(panel2, 1, wx.ALL | wx.EXPAND, 5)
        self.panel2 = panel2
        
        panel3 = wx.Panel(main_panel)
        panel3.SetBackgroundColour("blue")
        vbox.Add(panel3, 1, wx.ALL | wx.EXPAND, 5)
        self.panel3 = panel3
    
    
    def show_all(self, event = None):
        self.Freeze()
        self.panel1.Show()
        self.panel2.Show()
        self.panel3.Show()
        self.main_panel.Layout()
        self.Thaw()
    
    
    def show_panel1(self, event = None):
        self.Freeze()
        self.panel1.Show()
        self.panel2.Hide()
        self.panel3.Hide()
        self.main_panel.Layout()
        self.Thaw()
    
    
    def show_panel2(self, event = None):
        self.Freeze()
        self.panel1.Hide()
        self.panel2.Show()
        self.panel3.Hide()
        self.main_panel.Layout()
        self.Thaw()
    
    
    def show_panel3(self, event = None):
        self.Freeze()
        self.panel1.Hide()
        self.panel2.Hide()
        self.panel3.Show()
        self.main_panel.Layout()
        self.Thaw()
    

def main():
    """Testing"""
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
Du kannst aber auch die Panels aus dem Sizer raus nehmen und neu hinzufügen. Siehe: http://www.python-forum.de/topic-10536.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Dienstag 6. Mai 2008, 15:22

Vielen Dank gerold, ein so großes Beispiel wäre wirklich nicht nötig gewesen :) Und ja die 2. Methode gefällt mir besser; es fühlt sich einfach sauberer an, kA warum.

Thx, apollo13
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 6. Mai 2008, 16:40

apollo13 hat geschrieben:die 2. Methode gefällt mir besser; es fühlt sich einfach sauberer an, kA warum.
Hallo apollo13!

Ist sie aber nicht. Die zweite Methode ist nur dann interessant, wenn du die Panels neu erstellst und nicht im Speicher hälst. Also, wenn du beim Starten des Programms noch gar nicht weißt, welche oder wieviele Panels du brauchst. Oder wenn es ein Speicherproblem wäre, wenn die Panels schon existieren.

Für dein geschildertes Problem würde ich die erste Methode vorziehen, denn dann schweben die unsichtbaren Panels nicht irgendwo in der Luft herum. Sie sind schon an den Sizer gebunden. Das dürfte auch im Programmablauf schneller sein.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Dienstag 6. Mai 2008, 17:21

gerold hat geschrieben:Die zweite Methode ist nur dann interessant, wenn du die Panels neu erstellst und nicht im Speicher hälst. Also, wenn du beim Starten des Programms noch gar nicht weißt, welche oder wieviele Panels du brauchst.
Und genau das trifft in meinem Fall zu. Das Clientprogramm (Ganz ein dummer Client, der alles Events etc zum Server schickt... [Die aktuelle Qt/c++ Version funktioniert übrigens super, und ist sogar schnell]) bekommt vom Server xrc Files übertragen, die es dann anzeigt und die events wieder zum Server schickt, der dann zb sagt, dass ich jetzt das nächste anzeigen soll etc...
Antworten