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

Tkinter Python Discussion :

Fuite de mémoire ?


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut Fuite de mémoire ?
    Bonjour,

    Je travaille depuis un mois avec Python intégré dans une appli C/C++. Il m'est nécessaire de générer à partir de Python des fenêtres simples. Pour ce faire, j'ai choisi TKinter.

    Avant toute chose, j'initialise l'environnement python en définissant mes imports et mes classes (je ne poste que le contenu d'une classe, les autres étant similaires). J'appelle ce script depuis mon appli C/C++ :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    import sys
    import Tkinter
    import TestingToolsLib
    #Librairie de test C/C++ 
    libtest = TestingToolsLib.TestingToolsLib()
     
    #Classe GUI pour le test audio
    class GUI_Audio(Tkinter.Tk):
        def __init__(self,parent):
            Tkinter.Tk.__init__(self,parent)
            self.parent = parent
            self.initialize()
     
        def initialize(self):
            self.grid()
            #DISPLAYED MESSAGE TO USER
            w = Tkinter.Label(self, text="Did you hear any sound ?", font=("Helvetica", 16),height=3, width=50)
            w.grid(column=0,row=0, columnspan=2, sticky='EW')
     
            button = Tkinter.Button(self,text=u"Yes",font=("Helvetica", 16),
                                    command=self.OnButtonClickYes)
            button.grid(column=0,row=1, sticky='EW')
     
            button = Tkinter.Button(self,text=u"No",font=("Helvetica", 16),
                                    command=self.OnButtonClickNo)
            button.grid(column=1,row=1, sticky='EW')
     
            self.bind_all('<Return>',self.OnKeyYes)
            self.bind_all('o',self.OnKeyYes)
            self.bind_all('y',self.OnKeyYes)
            self.bind_all('n',self.OnKeyNo)
     
            self.protocol("WM_DELETE_WINDOW", self.Myquit)
     
            self.resizable(False,False)
             #Center window
            self.update()
            sw = self.winfo_screenwidth()
            sh = self.winfo_screenheight()
            w = self.winfo_width()
            h = self.winfo_height()
            x = (sw - w)/2
            y = (sh - h)/2
            geom = '%dx%d+%d+%d' % (w, h, x, y)
            self.geometry(geom)   
     
            self.title('Audio Test')
     
             #RUN TEST
            libtest.runTest("Audio")
            self.focus_force()
     
        def Myquit(self):
            print ""
     
        def OnKeyYes(self, event):
            self.OnButtonClickYes()
     
        def OnKeyNo(self, event):
            self.OnButtonClickNo()
     
        def OnButtonClickYes(self):
            #TEST OK
            libtest.addTestResult("Audio","OK")
            self.MyExit()
     
        def OnButtonClickNo(self):
            #TEST ERROR
            libtest.addTestResult("Audio","ERROR")
            libtest.notifyError()
            self.MyExit()
     
        def MyExit(self):
            libtest.reinitDevice()
            Tkinter.Tk.destroy(self)
    Une fois ceci fait, il est possible de faire appel à d'autres scripts utilisant les classes GUI définies précédemment. Voici un extrait d'un script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    fenAu = GUI_Audio(None)
    fenAu.mainloop()
    del fenAu
     
    fenTFT = GUI_TFT(None)
    fenTFT.mainloop()
    del fenTFT
     
    fenLED = GUI_LEDs(None)
    fenLED.mainloop()
    del fenLED
    Voici le soucis constaté : au cours de l'exécution de mon appli, à chaque appel à ce script, la mémoire utilisée par l'application augmente. Je ne parviens pas à libérer les ressources attribuées lors de la création de l'interface graphique.

    Apparemment, le garbage collector gère lui même la destruction des objets en fonction du listing des références. Est il possible que les choses soient un peu différentes avec l'utilisation du module TKinter?

    Plusieurs recherches sur la toile m'ont amené au même type de problème rencontré, mais jamais à sa solution. J'espère avoir plus de chance par ici =)

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    Peut être que vous pouvez étudier le problème avec le module gc (Garbage Collector, bibliothèque standard) pour en savoir plus sur le fonctionnement du ramasse-miette avec vos objets.

  3. #3
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    J'ai fait plusieurs tests différents, notamment avec le gc, sans succès. J'ai l'impression que TKinter possède des soucis au niveau de ces fuites. Ayant fait des recherches sur le net, j'ai été confronté pas mal de fois à des posts concernant des fuites de mémoire.

    N'ayant pas trouvé de solution à ce sujet, je me suis tourné vers l'utilisation des librairies wxPython, moins gourmandes, plus rapides, et plus riches.

Discussions similaires

  1. fuite de mémoire ?
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 12/01/2006, 16h19
  2. Réponses: 1
    Dernier message: 02/12/2005, 14h18
  3. fuite de mémoire
    Par mamag dans le forum MFC
    Réponses: 17
    Dernier message: 19/08/2005, 10h42
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 20h44
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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