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 :

Problème de fenêtre qui ne se détruit pas


Sujet :

wxPython

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Problème de fenêtre qui ne se détruit pas
    Bonjour,

    Voilà, j'ai une appli Python qui a besoin d'ouvrir une fenêtre (de taille 0,0) pour lancer un wxfiledialog pr la sauvegarde/ l'ouverture de fichiers par l'utilisateur :

    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
    class Fenetre(wxFrame):
    	def __init__(self,titre,text):
               wxFrame.__init__(self,None,-1,titre,(0,0),(500,500), style=wxFRAME_NO_WINDOW_MENU|wxDEFAULT_FRAME_STYLE|wxMAXIMIZE)
    	   self.msg=text
     
            def Open(self):
    	    dlg = wxFileDialog(self, "Choisissez un emplacement", "", "", "*.iri", wxOPEN|wxCHANGE_DIR)
    	    if dlg.ShowModal()==wxID_OK:
    		self.msg=dlg.GetPath()
    	    dlg.Destroy()
                self.destroy()
     
    class ApplicationOpen(wx.App):
    	def OnInit(self):
    		fenetre = Fenetre("Open")
    		fenetre.Show(True)
    		self.SetTopWindow(fenetre)
    		fenetre.Open()
    		return 1
     
    Et dans la classe lançant l'application ApplicationOpen :
    	def openFile(self):
    		app = ApplicationOpen()
    		while app.res == "init":
    			pass
    		self.rendu=app.res
    		app.MainLoop()
    Voilà, mon problème étant que le self.Destroy() ne fonctionne pas, j'ai essayé de mettre un fenetre.Destroy() dans la classe de l'Application, avec toujours le même résultat : la fenêtre survit !!

    Avez vous une solution s'il vous plait ?

  2. #2
    Membre averti
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Points : 342
    Points
    342
    Par défaut
    Met ton code entre les balises code, car on ne peut pas identifier les éventuelles erreurs d'indentation.

    Tu as par ailleurs écrit :
    au lieu de :
    Attention, Python est sensible à la casse...
    Je ne traite pas les problèmes techniques par MP...
    Les forums sont là pour ça...

    Les contributions du bipede

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    En effet c'est un peu idiot de ne pas montrer l'indentation

    Le self.destroy() n'est pas dans mon code, je 'lavais rajouté à la main parce que j'avais loupé mon copier-coller (en oubliant la majuscule qui y est dans le code )

    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
     
    class ApplicationOpen(wx.App):
    	def OnInit(self):
    		fenetre = Fenetre("Open")
    		self.SetTopWindow(fenetre)
    		fenetre.Show(1)
    		self.res=fenetre.msg
    		fenetre.Destroy()
    		return 1
     
    class Fenetre(wxFrame):
    	def __init__(self,titre):
    		wxFrame.__init__(self,None,-1,titre,(100,100),(500,500))
    		self.Center()
    		self.msg="init"
    		if titre == "Open":
    			self.Open()
     
    	def Open(self):
    		dlg = wxFileDialog(self, "Choisissez un emplacement", "", "", "*.iri", wxOPEN|wxCHANGE_DIR)
    		if dlg.ShowModal()==wxID_OK:
    			self.msg=dlg.GetPath()
    		else:
    			self.msg="cancel"	
    		dlg.Destroy()
    		self.Destroy()
    Et le lancement de applicationopen() dans une autre classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	def openFile(self):
    		app = ApplicationOpen()
    		#frame = Fenetre("Chargement","open")
    		#app.SetTopWindow(frame)
    		#frame.Show(True)
    		#frame.Open()
    		self.rendu=app.res
    		app.MainLoop()
    		#frame.Destroy()
    En fait mon but est que la fenetre s'ouvre au premier plan (j'ai une appli flash qui tourne et je voudrais que l'appli python se mette devant automatiquement). Ca marche la première fois, mais la fenetre ne se detruit pas donc par la suite la fenetre prend le focus avec settopwindow, mais seulement le focus relatif à python, donc ne passe pas "devant" mon appli flash. Du moins c'est l'explication que je me fais :s

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    J'ajoute juste que j'ai mis un self.Destroy dans le wxFileDialog et un fenetre.Destroy() dans l'application, mais ce n'était que pour les tests, en n'en mettant qu'un des deux, n'importe lequel, ca ne marche pas non plus

  5. #5
    Membre averti
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Points : 342
    Points
    342
    Par défaut
    Je suis peut-être lourd, mais je ne comprend pas bien l'articulation de ton programme.

    La classe wx.App() est la classe de base de tout IHM en wxPython, et la wx.Frame déclarée par la méthode SetTopWindow() au sein cette classe, est la fenêtre principale de l'application, sans laquelle l'appli ne pourrait pas tourner.

    Donc, créer une instance de ta classe ApplicationOpen à partir d'une méthode située dans une autre classe (OpenFile) me paraît peu cohérent, et ça doit être cette incohérence qui fait que tu ne peux pas détruire ta fenêtre.

    Essaie de m'exposer précisemment ce que tu veux faire...
    Je ne traite pas les problèmes techniques par MP...
    Les forums sont là pour ça...

    Les contributions du bipede

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ah oui je vois !!

    En fait mon application n'est pas quelque chose de graphique à la base ! C'est un serveur qui communique avec une appli Flash et qui traite les données que lui envoie Flash. Et quand Flash lui envoie un certain code genre une chaîne de caractère commencant par "open", python déclenche la procédure d'ouverture de fichier, qui consiste à ouvrir une petite boîte de dialogue d'ouverture de fichier classique (wxFileDialog ...), à récupérer le chemin du fichier choisi par l'utilisateur, et à le renvoyer à Flash par l'intermédiaire de la socket pour que Flash puisse l'ouvrir (oui ca parait un peu tordu je le reconnais ).

    L'idée état donc d'instancier une "wx.App()" à chaque nouvel appel de "open".

    Et donc mon problème c'est que quand l'utilisateur clique dans l'appli Flash sur le bouton pour ouvrir un fichier, la boite de dialogue s'ouvre bien, mais derrière la fenêtre de l'appli Flash !!

    Voilà voilà, j'espère avoir été plus clair, tu n'es pas lourd du tout et je te remercie de prendre du temps pour essayer de m'aider, je suis un peu confus !

  7. #7
    Membre averti
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Points : 342
    Points
    342
    Par défaut
    Dans ce cas, un simple script comme celui-ci devrait suffire
    La dernière ligne n'est là que pour tester.

    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
    #! /usr/bin/env python
    #-*- coding: utf-8 -*-
     
    import wx
     
    def Open():
        app = wx.App()
        dlg = wx.FileDialog(None, "Choisissez un emplacement", "", "", "*.iri", wx.OPEN|wx.CHANGE_DIR)
        if dlg.ShowModal()==wx.ID_OK:
            msg=dlg.GetPath()
        else:
            msg="cancel"	
        dlg.Destroy()
        return msg
     
    print Open()
    Je ne traite pas les problèmes techniques par MP...
    Les forums sont là pour ça...

    Les contributions du bipede

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ah oui c'est quand meme plus simple que tout mon been's ...

    Le truc c'est que ca ne regle pas mon probleme de focus, en effet la première fois la fenetre s'ouvre bien devant mon appli Flash, mais pas la deuxième fois ... :'(

    Tant pis je me suis fait un petit script qui prend la boite de dialogue et la met devant (en fonction de l'os), c'est un peu ... pas très classe, mais bon ...

    Merci beaucoup en tout cas !!

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/02/2008, 18h55
  2. Problème de DIV qui ne s'étendent pas
    Par sorry60 dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 28/06/2007, 15h49
  3. Réponses: 6
    Dernier message: 19/02/2007, 15h50
  4. [Struts] Problème d'ActionForm qui ne s'instancie pas
    Par vallica dans le forum Struts 1
    Réponses: 35
    Dernier message: 10/04/2006, 22h39
  5. [MFC] Ces fenêtres qui ne s'affichent pas..
    Par Davide dans le forum MFC
    Réponses: 3
    Dernier message: 19/11/2003, 11h30

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