IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxPython Discussion :

Fenêtre au premier plan


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut Fenêtre au premier plan
    Bonsoir,

    Je débute en wxPython (et en interface graphique même si j'ai un peu manipulé Tkinter et je suis auto-didacte) et il y a quelque chose que je ne comprends pas bien.

    J'aimerais ouvrir depuis ma Frame principale une autre Frame et que cette Frame soit placée devant ma Frame principale.

    J'ai isolé mon problème dans le script suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    import wx
     
    class App(wx.App):
     
        def OnInit(self):
     
            self.frame=FirstFrame()
            self.frame.Centre()
            self.frame.Show()
            return True
     
    class FirstFrame(wx.Frame):
     
        def __init__(self):
     
            wx.Frame.__init__(self,None,-1,"First Frame",size=(800,600))
            panel=wx.Panel(self)
            button=wx.Button(panel,-1,"Second Frame")
            self.Bind(wx.EVT_BUTTON,self.OnClickOk,button)
            self.Bind(wx.EVT_CLOSE,self.OnClose)
     
            self.OpenSecondFrame()
     
        def OnClickOk(self,event):
     
            self.OpenSecondFrame()
     
     
        def OpenSecondFrame(self):
     
            self.second=SecondFrame()
            self.second.Centre()
            self.second.MakeModal(True)
            self.second.Show()        
     
        def OnClose(self,event):
     
            self.Destroy()
     
    class SecondFrame(wx.Frame):
     
        def __init__(self):
     
            wx.Frame.__init__(self,None,-1,"Second Frame",size=(200,200))
            panel=wx.Panel(self)
            button=wx.Button(panel,-1,"Close")
            self.Bind(wx.EVT_BUTTON,self.OnClickClose,button)
     
        def OnClickClose(self,event):
     
            self.MakeModal(False)
            self.Destroy()
     
     
    if __name__ == "__main__":
        app=App()
        app.MainLoop()
    Et je remarque une différence de comportement que je ne m'explique pas.

    Lorsque SecondFrame est instanciée à partir du clic sur le bouton, elle apparait bien au premier plan et on ne peut pas interagir avec FirstFrame.

    J'instancie aussi SecondFrame dans le __init__ de FirstFrame mais dans ce cas la fenêtre apparait derrière la fenêtre principale.

    Alors que c'est la même fonction qui instancie SecondFrame.

    C'est peut être lié au fait que dans le premier cas, on appelle d'abord la méthode Show() de SecondFrame puis celle de FirstFrame et que dans le second cas c'est l'inverse.

    Toujours est il que je ne sais pas comment faire pour avoir ma deuxième frame devant dans tous les cas, même si je suppose que c'est quelque chose de tout bête...

    Merci par avance pour votre aide.

    Si vous voyez aussi autre chose dire par rapport à mon script hésitez pas, je suis preneur de tout type de conseil .

    Kango

  2. #2
    Membre confirmé Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Par défaut
    Citation Envoyé par kango
    Lorsque SecondFrame est instanciée à partir du clic sur le bouton, elle apparait bien au premier plan et on ne peut pas interagir avec FirstFrame.
    Si je comprends bien donc, tu veux que l'on puisse toujours interagir avec FirstFrame.

    Si c'est le cas, le problème c'est que dans la méthode FirstFrame.OpenSecondFrame(), tu fais self.second.MakeModal(True) ce qui fais que tous les autres fenêtres à part SecondFrame sont désactivées, enlever cette ligne devrait résoudre ton problème.

    Citation Envoyé par kango
    J'instancie aussi SecondFrame dans le __init__ de FirstFrame mais dans ce cas la fenêtre apparait derrière la fenêtre principale.

    Alors que c'est la même fonction qui instancie SecondFrame.

    C'est peut être lié au fait que dans le premier cas, on appelle d'abord la méthode Show() de SecondFrame puis celle de FirstFrame et que dans le second cas c'est l'inverse.
    Tu as raison, c'est parceque la méthode Show() de SecondFrame est appellée avant celle de FirstFrame.

    Dans ce cas, tu peux faire que FirstFrame soit parent de SecondFrame ou bien appeller SecondFrame.Show(False) dans le constructeur de FirsFrame, ensuite appeller SecodFrame.Show(True), dans FirstFrame.OpenSecondFrame()

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    merci pour ta réponse,

    en fait je veux que la seconde frame soit modale, donc mon problème vient uniquement du fait qu'elle est placée au second plan.

    et tu confirmes ce que je soupçonnais avec l'ordre d'appel des .Show().

    comment souvent, ça me prouve que mon truc est pas bien conçu . c'est pas propre d'ouvrir une frame depuis une autre frame dans le __init__.

    du coup, j'instancie ma seconde frame dans la classe App et comme ça je peux déplacer l'ordre des .Show(). à l'ouverture ma seconde frame est bien devant.

    à bientôt pour une autre question

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment mettre une fenêtre au premier plan?
    Par damien99 dans le forum MFC
    Réponses: 11
    Dernier message: 30/08/2006, 11h37
  2. Mettre une fenêtre au premier plan
    Par Riko dans le forum Delphi
    Réponses: 4
    Dernier message: 20/06/2006, 19h30
  3. Script VBS - Focus garder la fenêtre en premier plan
    Par Furius dans le forum VBScript
    Réponses: 4
    Dernier message: 12/12/2005, 23h27
  4. Fenêtre au premier plan
    Par MeDioN dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 09/10/2005, 14h02
  5. Réponses: 2
    Dernier message: 14/03/2004, 22h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo