Neues Fenster als child-Objekt

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Hallo zusammen!

Nachdem ich mich nun ein paar Tage eingelesen habe, beschloss ich, auch selbst einmal eine Frage zu stellen.

Ich verwende wxPython 2.6 und GNU/Linux Ubuntu 5.10.

Einige wxPython-Tutorials habe ich bereits durchgearbeitet und einige kleine Applikationen erstellt. Ist meine erste Erfahrung mit Python und ich bin positiv überrascht.

Probiere jetzt schon seit längerer Zeit, ein zweites Fenster zu dem Hauptfenster einer einfachen Applikation zu erstellen, und zwar als Child-Objekt. Als Basis benutzte ich dafür den berühmten "simplen Texteditor".

(Grundlegende Programmierkenntnisse sind vorhanden)

Wenn da jemand einen Hinweis parat hat, würde ich ihn sehr gerne hören :)

Grüße
Klip
Zuletzt geändert von Klip am Freitag 18. August 2006, 17:07, 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:

Klip hat geschrieben:Probiere jetzt schon seit längerer Zeit, ein zweites Fenster zu dem Hauptfenster einer einfachen Applikation zu erstellen, und zwar als Child-Objekt.
Hi Klip!

Willkommen im Python-Forum!

Mir ist nicht ganz klar, was du als Child-Objekt verstehst. Möchtest du ein Fenster in ein anderes Fenster einbinden, oder möchtest du ein zweites (modales) Fenster aufmachen, das ober dem ersten Fenster steht? -- So dass man im ersten Fenster erst wieder etwas tun kann, wenn man das zweite Fenster geschlossen hat.

Für ersten Fall, empfehle ich mehrere ``wx.Panel`` zu erstellen, welche du je nach Bedarf im ``wx.Frame`` anzeigen kannst.

Für zweiten Fall, gibt es zuerst mal ``wx.Dialog``, das ähnlich wie ein Frame zu verwenden ist. Der Unterschied ist, dass du einen Dialog über die Methode ``ShowModal()`` aufrufen kannst. --> Der Code bleibt an dieser Stelle stehen, bis das Dialog-Fenster wieder geschlossen wurde.
Dann gibt es noch die Möglichkeit, ein ``wx.Frame``-Objekt *modal* zu machen. Das geht mit der Methode ``MakeModal()``. (Siehe auch: http://www.python-forum.de/post-39104.html#39104 )

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Das zweite Fenster soll schon "außerhalb" des ersten Fensters erscheinen, aber man soll auch weiterhin das erste Fenster nutzen können, so meinte ich das. Tut mir leid, wenn es nicht klar ersichtlich war :wink: .

Danke für die Hinweise. Ich setze mich mal enger mit den genannten Funktionen auseinander. Wenn ich Erfolg habe oder verzweifle, melde ich mich nochmal :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Klip hat geschrieben:Das zweite Fenster soll schon "außerhalb" des ersten Fensters erscheinen, aber man soll auch weiterhin das erste Fenster nutzen können
Hi Klip!

Hier ist ein Beispiel das genau so funktioniert:

EDIT: Code ausgelagert: http://paste.pocoo.org/show/89659/

mfg
Gerold
:-)
Zuletzt geändert von gerold am Freitag 31. Oktober 2008, 12:54, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Danke für die schnelle Hilfe, gerold!

Ich habe verstanden, wie es funktioniert. Bin gerade dabei, mein Programm zu modifizieren.

EDIT: Es hat geklappt! Mein Programm läuft jetzt genau so, wie ich es mir vorgestellt habe! Nochmals ein Dankeschön an dich.

Grüße
Klip
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Wennn ich den Thread noch mal ausgraben darf:

wieso kann ich mit z.B.

Code: Alles auswählen

class MyAdditionalFrame(wx.Frame):
    """
    Frame-Klasse für die Fenster, die vom Haupt-Frame aus geöffnet werden.
    """
    
    def __init__(self, parent = None, id = -1, title = "Neues Frame"):
        """
        Initialisiert das zusätzliche Frame und baut es auf
        """
        
        wx.Frame.__init__(self, parent, id, title)
        # -> erzeugen des Basispanels für das zusätzliche Frame ?
        panel = wx.Panel(self)

        lab = wx.StaticText(self, -1, "Ich bin ein neues Fenster (Frame)")
        
        self.Show()
kein Framefüllendes Basispanel erzeugen??
Zuletzt geändert von mathi am Freitag 31. Oktober 2008, 12:54, 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:

mathi hat geschrieben:

Code: Alles auswählen

        lab = wx.StaticText(self, -1, "Ich bin ein neues Fenster (Frame)")
Hallo mathi!

Ich verstehe deine Frage nicht. Außerdem ist in deinem beispiel etwas falsch. Du legst das StaticText-Widget nicht in das Panel, sondern in den Frame. Damit ist das Panel nicht mehr das einzige Widget im Frame. Und nur wenn ein Widget das **einzige** Widget im Frame ist, füllt es automatisch den ganzen Platz aus.

Besser:

Code: Alles auswählen

        lab = wx.StaticText(panel, -1, "Ich bin ein neues Fenster (Frame)")
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Super, danke, das war es :-)
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hi Alle,

da hatte Jemand den gleichen Wunsch wie ich vor 2 Jahren. :-)
Schön zu hören. :-)

Ok ich habe von Gerold die Idee übernommen, nur macht er bei mir das neue Frame nur einmal auf. Beim zweiten und weiteren öffnen erscheint kein neues Frame. Hat da vielleicht Jemand eine Idee was ich falsch mache ?

Mein code sieht so aus.

Code: Alles auswählen

class HistoFrame(wx.Frame):
    def __init__(self,starttime,endtime,timescale,peaks_found,
                 times_peaks_appeared,*args,**kwargs):
    . . . 
        self.settings = wx.MenuItem(self.optMenu,301,'&Settings',
                                    'Show and save Settings.')
        self.Bind(wx.EVT_MENU,self.runSettings(self),id=301)
    . . .

    def runSettings(self,parent):
        settingWindow = Settings(parent)
        settingWindow.Show()

class Settings(wx.Frame):
    def __init__(self,parent,id=-1,title='Settings',*args,**kwargs):
        wx.Frame.__init__(self,parent,id,title,*args,**kwargs)
         self.Bind(wx.EVT_CLOSE,self.onQuit)

    def onQuit(self,event):
        self.Destroy()
Fehlermeldungen gibt es keine, allerdings wird das Settings Fenster gleich zu Beginn des Starts der Applikation gestartet.

Grüße Markus
Zuletzt geändert von feldmaus am Donnerstag 25. Juni 2009, 20:58, insgesamt 2-mal geändert.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Ich habe gerade noch was gefunden,
http://www.python-forum.de/topic-1552.h ... terfenster
Allerdings habe ich das auch nicht hinbekommen mit deren Lösung.

Wie nennt sich denn das event welches das Fenster schließt ?

Ok ich habe mal was bei meinem Code oben hinzugefügt.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Ich habe meinen Fehler gefunden. Also der code sollte so aussehen.

Code: Alles auswählen

class HistoFrame(wx.Frame):
    def __init__(self,starttime,endtime,timescale,peaks_found,
                 times_peaks_appeared,*args,**kwargs):
    . . .
        self.settings = wx.MenuItem(self.optMenu,301,'&Settings',
                                    'Show and save Settings.')
        self.Bind(wx.EVT_MENU,self.runSettings,id=301)
    . . .

    def runSettings(self,event):
        settingWindow = Settings(self)
        settingWindow.Show(True)

class Settings(wx.Frame):
    def __init__(self,parent,id=-1,title='Settings',*args,**kwargs):
        wx.Frame.__init__(self,parent,id,title,*args,**kwargs)
        self.Bind(wx.EVT_CLOSE,self.onQuit)

    def onQuit(self,event):
        self.Destroy()
Der Fehler ist, dass ich die Klammer hatte. Ohne Klammer scheint es zu funktionieren. Mit Klammer meine ich Zeile 7.

Wäre schön wenn ein Spezialist mal den Unterschied erklären könnte. Also was das aus macht, ob man
self.Bind(wx.EVT_MENU,self.runSettings(),id=301)
oder
self.Bind(wx.EVT_MENU,self.runSettings,id=301)
schreibt.

Grüße Markus
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du fragst ehrlich was der Unterschied zwischen dem *übergeben* einer Funktion und dem sofortigen *aufrufen* einer Funktion ist?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Danke Leonidas, ich wusste doch das ich das mal gehört hatte. Jetzt wird mir einiges klar. :-)

Grüße Markus
Antworten