OVH Cloud OVH Cloud

[wxpython] Une seule instance de fenetre fille

5 réponses
Avatar
croclebo
Bonjour,

Dans la fenêtre principale de mon application, il y a un bouton qui
ouvre une fenêtre secondaire.
Je ne veux pas que cette deuxième fenêtre soit modale. (elle ne l'est pas)
Si on clique une deuxième fois sur le bouton, une deuxième fenètre
s'ouvre, mais je ne veux avoir qu'un seul exemplaire de ma fenètre.

J'ai tenté de résoudre le problème comme ceci :
En "testant l'existence" de la fiche2 dans la fonction "chargeBTN_click"

code.py:
--------------------------------------------------
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

class Secondaire(wx.Frame):


def __init__(self,titre,parent):

wx.Frame.__init__(self,parent,-1,title = titre,size= (800,600))
panel = wx.Panel(self,-1)



class Principal(wx.Frame):


def __init__(self,titre):

wx.Frame.__init__(self,None,-1,title = titre)
panel = wx.Panel(self,-1)

chargeBTN = wx.Button(panel,-1,label = "Charge")
self.Bind(wx.EVT_BUTTON,self.chargeBTN_click,chargeBTN)

def chargeBTN_click(self,evt):
try : self.fiche2
except (AttributeError,wx.PyDeadObjectError,),err:
self.fiche2=Secondaire('Deuz',self)
self.fiche2.Show(True)

class MonApp(wx.App):
def OnInit(self):
fenprincipale = Principal('titre')
fenprincipale.Show(True)
self.SetTopWindow(fenprincipale)
return True

app = MonApp()
app.MainLoop()
--------------------------------------------------



mais lorsque fiche2 est fermée, et que je re-clique sur le bouton, j'ai
l'erreur :
-------------------------------------------------
Traceback (most recent call last):
File "tmp.py", line 31, in chargeBTN_click
self.fiche2.Show(True)
File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-ansi/wx/_core.py",
line 13208, in __getattr__
raise PyDeadObjectError(self.attrStr % self._name)
wx._core.PyDeadObjectError: The C++ part of the Secondaire object has
been deleted, attribute access no longer allowed.
-------------------------------------------------



Croc
--
remplacez le serpent par un . pour m'envoyer un email

5 réponses

Avatar
Jerome
croclebo wrote:
Bonjour,


Bonjour


Dans la fenêtre principale de mon application, il y a un bouton qui
ouvre une fenêtre secondaire.
Je ne veux pas que cette deuxième fenêtre soit modale. (elle ne l'est pas)
Si on clique une deuxième fois sur le bouton, une deuxième fenètre
s'ouvre, mais je ne veux avoir qu'un seul exemplaire de ma fenètre.


Est-ce que tu veux réellement supprimer la fenètre fille ou bien juste
la cacher. Si tu veux la cacher, tu as juste à récupérer l'évènement de
fermeture et à la cacher.

J'ai tenté de résoudre le problème comme ceci :
En "testant l'existence" de la fiche2 dans la fonction "chargeBTN_click"

code.py:
--------------------------------------------------
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

class Secondaire(wx.Frame):


def __init__(self,titre,parent):

wx.Frame.__init__(self,parent,-1,title = titre,size= (800,600))
panel = wx.Panel(self,-1)


self.Bind(wx.EVT_CLOSE, self.OnClose)

def OnClose(self, evt):
self.Show(0)



class Principal(wx.Frame):


def __init__(self,titre):

wx.Frame.__init__(self,None,-1,title = titre)
panel = wx.Panel(self,-1)

chargeBTN = wx.Button(panel,-1,label = "Charge")
self.Bind(wx.EVT_BUTTON,self.chargeBTN_click,chargeBTN)


self.fiche2 = None


def chargeBTN_click(self,evt):
try : self.fiche2
except (AttributeError,wx.PyDeadObjectError,),err:
self.fiche2=Secondaire('Deuz',self)
self.fiche2.Show(True)


def chargeBTN_click(self,evt):
if not self.fiche2:
self.fiche2=Secondaire('Deuz',self)
self.fiche2.Show(True)


class MonApp(wx.App):
def OnInit(self):
fenprincipale = Principal('titre')
fenprincipale.Show(True)
self.SetTopWindow(fenprincipale)
return True

app = MonApp()
app.MainLoop()
--------------------------------------------------



mais lorsque fiche2 est fermée, et que je re-clique sur le bouton, j'ai
l'erreur :
-------------------------------------------------
Traceback (most recent call last):
File "tmp.py", line 31, in chargeBTN_click
self.fiche2.Show(True)
File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-ansi/wx/_core.py",
line 13208, in __getattr__
raise PyDeadObjectError(self.attrStr % self._name)
wx._core.PyDeadObjectError: The C++ part of the Secondaire object has
been deleted, attribute access no longer allowed.
-------------------------------------------------



Croc
--
remplacez le serpent par un . pour m'envoyer un email


Avatar
Olivier Ravard
croclebo wrote:
Bonjour,

Dans la fenêtre principale de mon application, il y a un bouton qui
ouvre une fenêtre secondaire.
Je ne veux pas que cette deuxième fenêtre soit modale. (elle ne l'est pas)
Si on clique une deuxième fois sur le bouton, une deuxième fenètre
s'ouvre, mais je ne veux avoir qu'un seul exemplaire de ma fenètre.

J'ai tenté de résoudre le problème comme ceci :
En "testant l'existence" de la fiche2 dans la fonction "chargeBTN_click"

code.py:
--------------------------------------------------
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

class Secondaire(wx.Frame):


def __init__(self,titre,parent):

wx.Frame.__init__(self,parent,-1,title = titre,size= (800,600))
panel = wx.Panel(self,-1)



class Principal(wx.Frame):


def __init__(self,titre):

wx.Frame.__init__(self,None,-1,title = titre)
panel = wx.Panel(self,-1)

chargeBTN = wx.Button(panel,-1,label = "Charge")
self.Bind(wx.EVT_BUTTON,self.chargeBTN_click,chargeBTN)

def chargeBTN_click(self,evt):
try : self.fiche2.Show(True)

except (AttributeError,wx.PyDeadObjectError,),err:
self.fiche2=Secondaire('Deuz',self)
self.fiche2.Show(True)

class MonApp(wx.App):
def OnInit(self):
fenprincipale = Principal('titre')
fenprincipale.Show(True)
self.SetTopWindow(fenprincipale)
return True

app = MonApp()
app.MainLoop()
--------------------------------------------------



mais lorsque fiche2 est fermée, et que je re-clique sur le bouton, j'ai
l'erreur :
-------------------------------------------------
Traceback (most recent call last):
File "tmp.py", line 31, in chargeBTN_click
self.fiche2.Show(True)
File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-ansi/wx/_core.py",
line 13208, in __getattr__
raise PyDeadObjectError(self.attrStr % self._name)
wx._core.PyDeadObjectError: The C++ part of the Secondaire object has
been deleted, attribute access no longer allowed.
-------------------------------------------------



Croc
--
remplacez le serpent par un . pour m'envoyer un email


Avatar
croclebo
aaaaaaaaaaahh!
punaise!
Ca fait des jours que je cherche ce truc
merci!

try : self.fiche2.Show(True)
à la place de juste tester l'existence de fiche2
try : self.fiche2

par contre, je ne comprends pas pourquoi çà marche dans le sens là!


croclebo wrote:
Bonjour,

Dans la fenêtre principale de mon application, il y a un bouton qui
ouvre une fenêtre secondaire.
Je ne veux pas que cette deuxième fenêtre soit modale. (elle ne l'est
pas)
Si on clique une deuxième fois sur le bouton, une deuxième fenètre
s'ouvre, mais je ne veux avoir qu'un seul exemplaire de ma fenètre.

J'ai tenté de résoudre le problème comme ceci :
En "testant l'existence" de la fiche2 dans la fonction "chargeBTN_click"

code.py:
--------------------------------------------------
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

class Secondaire(wx.Frame):


def __init__(self,titre,parent):

wx.Frame.__init__(self,parent,-1,title = titre,size= (800,600))
panel = wx.Panel(self,-1)



class Principal(wx.Frame):


def __init__(self,titre):

wx.Frame.__init__(self,None,-1,title = titre)
panel = wx.Panel(self,-1)

chargeBTN = wx.Button(panel,-1,label = "Charge")
self.Bind(wx.EVT_BUTTON,self.chargeBTN_click,chargeBTN)

def chargeBTN_click(self,evt):
try : self.fiche2.Show(True)

except (AttributeError,wx.PyDeadObjectError,),err:
self.fiche2=Secondaire('Deuz',self)
self.fiche2.Show(True)

class MonApp(wx.App):
def OnInit(self):
fenprincipale = Principal('titre')
fenprincipale.Show(True)
self.SetTopWindow(fenprincipale)
return True

app = MonApp()
app.MainLoop()
--------------------------------------------------



mais lorsque fiche2 est fermée, et que je re-clique sur le bouton, j'ai
l'erreur :
-------------------------------------------------
Traceback (most recent call last):
File "tmp.py", line 31, in chargeBTN_click
self.fiche2.Show(True)
File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-ansi/wx/_core.py",
line 13208, in __getattr__
raise PyDeadObjectError(self.attrStr % self._name)
wx._core.PyDeadObjectError: The C++ part of the Secondaire object has
been deleted, attribute access no longer allowed.
-------------------------------------------------



Croc
--
remplacez le serpent par un . pour m'envoyer un email




Avatar
croclebo
croclebo wrote:
Bonjour,


Bonjour


Dans la fenêtre principale de mon application, il y a un bouton qui
ouvre une fenêtre secondaire.
Je ne veux pas que cette deuxième fenêtre soit modale. (elle ne l'est
pas)
Si on clique une deuxième fois sur le bouton, une deuxième fenètre
s'ouvre, mais je ne veux avoir qu'un seul exemplaire de ma fenètre.


Est-ce que tu veux réellement supprimer la fenètre fille ou bien juste
la cacher. Si tu veux la cacher, tu as juste à récupérer l'évènement de
fermeture et à la cacher.


Oui, j'ai essayé en la cachant et çà marche, mais je ne veux pas faire.
C'est moins propre. Si en plus j'ai de nombreuse fenêtre à ourvrir,
alors là c'est le gachis de ressources.


Avatar
Jerome
Parce que quand ta fenêtre est détruite ta variable fiche2 ne vaut pas
None mais une référence vers un objet détruit de wxpython. Le
self.fiche2.Show génère une exception, pas le self.fiche2.


croclebo wrote:
aaaaaaaaaaahh!
punaise!
Ca fait des jours que je cherche ce truc
merci!

try : self.fiche2.Show(True)
à la place de juste tester l'existence de fiche2
try : self.fiche2

par contre, je ne comprends pas pourquoi çà marche dans le sens là!



croclebo wrote:

Bonjour,

Dans la fenêtre principale de mon application, il y a un bouton qui
ouvre une fenêtre secondaire.
Je ne veux pas que cette deuxième fenêtre soit modale. (elle ne l'est
pas)
Si on clique une deuxième fois sur le bouton, une deuxième fenètre
s'ouvre, mais je ne veux avoir qu'un seul exemplaire de ma fenètre.

J'ai tenté de résoudre le problème comme ceci :
En "testant l'existence" de la fiche2 dans la fonction "chargeBTN_click"

code.py:
--------------------------------------------------
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

class Secondaire(wx.Frame):


def __init__(self,titre,parent):

wx.Frame.__init__(self,parent,-1,title = titre,size= (800,600))
panel = wx.Panel(self,-1)



class Principal(wx.Frame):


def __init__(self,titre):

wx.Frame.__init__(self,None,-1,title = titre)
panel = wx.Panel(self,-1)

chargeBTN = wx.Button(panel,-1,label = "Charge")
self.Bind(wx.EVT_BUTTON,self.chargeBTN_click,chargeBTN)

def chargeBTN_click(self,evt):


try : self.fiche2.Show(True)

except (AttributeError,wx.PyDeadObjectError,),err:
self.fiche2=Secondaire('Deuz',self)
self.fiche2.Show(True)

class MonApp(wx.App):
def OnInit(self):
fenprincipale = Principal('titre')
fenprincipale.Show(True)
self.SetTopWindow(fenprincipale)
return True

app = MonApp()
app.MainLoop()
--------------------------------------------------



mais lorsque fiche2 est fermée, et que je re-clique sur le bouton, j'ai
l'erreur :
-------------------------------------------------
Traceback (most recent call last):
File "tmp.py", line 31, in chargeBTN_click
self.fiche2.Show(True)
File "/usr/lib/python2.4/site-packages/wx-2.6-gtk2-ansi/wx/_core.py",
line 13208, in __getattr__
raise PyDeadObjectError(self.attrStr % self._name)
wx._core.PyDeadObjectError: The C++ part of the Secondaire object has
been deleted, attribute access no longer allowed.
-------------------------------------------------



Croc
--
remplacez le serpent par un . pour m'envoyer un email