Seite 1 von 1

Neues Fenster als child-Objekt

Verfasst: Donnerstag 17. August 2006, 17:27
von Klip
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

Re: Neues Fenster als child-Objekt

Verfasst: Donnerstag 17. August 2006, 18:51
von gerold
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
:-)

Verfasst: Donnerstag 17. August 2006, 20:53
von Klip
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 :)

Verfasst: Donnerstag 17. August 2006, 21:54
von gerold
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
:-)

Verfasst: Freitag 18. August 2006, 17:07
von Klip
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

Verfasst: Freitag 31. Oktober 2008, 12:45
von mathi
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??

Verfasst: Freitag 31. Oktober 2008, 12:53
von gerold
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
:-)

Verfasst: Freitag 31. Oktober 2008, 12:56
von mathi
Super, danke, das war es :-)

Verfasst: Donnerstag 25. Juni 2009, 13:53
von feldmaus
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

Verfasst: Donnerstag 25. Juni 2009, 15:18
von feldmaus
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.

Verfasst: Donnerstag 25. Juni 2009, 21:07
von feldmaus
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

Verfasst: Donnerstag 25. Juni 2009, 21:42
von Leonidas
Du fragst ehrlich was der Unterschied zwischen dem *übergeben* einer Funktion und dem sofortigen *aufrufen* einer Funktion ist?

Verfasst: Donnerstag 25. Juni 2009, 23:31
von feldmaus
Danke Leonidas, ich wusste doch das ich das mal gehört hatte. Jetzt wird mir einiges klar. :-)

Grüße Markus