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 :

Instances multiples de Tk et PhotoImage


Sujet :

Tkinter Python

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut Instances multiples de Tk et PhotoImage
    Bonjour, j'ai une application principale composée d'une classe dérivée de Tk. Pour ouvrir une 2eme fois l'application, j'ai une fonction "nouvelle" qui instancie de nouveau la classe de mon application. Pour ce faire, j'ai fait un bouton avec une image commandant la fonction "nouvelle". Quand je lance le programme tout va bien. Si je clique sur le bouton, j'ai une erreur à cause de l'objet image qui n'existe pas lors de la 2eme instanciation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
        return self.func(*args)
      File "C:\Documents and Settings\VEGA\Bureau\test.py", line 12, in nouvelle
        Fenprinc()
      File "C:\Documents and Settings\VEGA\Bureau\test.py", line 9, in __init__
        self.but = Button(self, image=self.image, command=self.nouvelle)
      File "C:\Python25\lib\lib-tk\Tkinter.py", line 2000, in __init__
        Widget.__init__(self, master, 'button', cnf, kw)
      File "C:\Python25\lib\lib-tk\Tkinter.py", line 1930, in __init__
        (widgetName, self._w) + extra + self._options(cnf))
    TclError: image "pyimage2" doesn't exist
    Questions:
    1-Où est le problème pour l'image??
    2-La façon d'instancier mon programme la 2eme fois est incorrecte et donc la cause de mon problème d'image?

    Voici le code d'un programme simplifié (car mon application fait 1300 lignes et je ne veux pas vous imposer de les lires...) mais qui reproduit mon problème :
    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
     
    # -*- coding:Latin-1 -*-
     
    from Tkinter import *
    class Fenprinc(Tk):
        '''Fenêtre principale de l'application'''
        def __init__(self):
            Tk.__init__(self)
            self.image = PhotoImage(file='nouveau.gif')
            self.but = Button(self, image=self.image, command=self.nouvelle)
            self.but.pack()
        def nouvelle(self):
            Fenprinc()
    if __name__ == "__main__":
        Fenprinc().mainloop()
    PS: ne pas oublier de télécharger l'image avec (ou modifiez le code avec une image gif de votre choix)
    Merci d'avance
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Tu ne peux avoir qu'une instance de Tk, si tu as besoin d'autres fenêtres, ce doit être des Toplevel

    Bon, voilà un exemple (pas très propre)

    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
    # -*- coding:Latin-1 -*-
     
    from Tkinter import *
    class Fenprinc(Toplevel):
        """Fenêtre principale de l'application"""
        def __init__(self, parent):
            Toplevel.__init__(self, parent)
            self.image = PhotoImage(file='nouveau.gif')
            self.but = Button(self, image=self.image, command=self.nouvelle)
            self.but.pack()
        def nouvelle(self):
            Fenprinc(self)
     
    if __name__ == "__main__":
        root = Tk()
        Fenprinc(root)
        root.mainloop()

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut Ca marche, mais j'ai une question subsidiaire...
    Merci, en effet maintenant cela marche. Cependant, je me retrouve avec une fenêtre Tk vide qui ne sert à rien puisque toutes mes fenêtres de l'application sont des Toplevel. Comme je ne veux pas la voir, j'ai utilisé :
    mais pour complètement fermer l'application quand toutes mes fenêtres (Toplevel) auront été fermées par l'utilisateur, il faut que je ferme aussi l'instance "root" de Tk. Je pensais faire un dictionnaire de la liste des Toplevel que je crée et intercepter la fermeture des Toplevel. Si la liste est vide, détruie "root", sinon juste fermer le Toplevel en question.

    Y a t il une façon plus éléguante de faire cela ou est ce que je viens de décrire est correct?

    Merci encore pour la réponse!!!!!

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

Discussions similaires

  1. Instances multiples d'un programme
    Par levalp dans le forum Langage
    Réponses: 1
    Dernier message: 28/06/2008, 14h17
  2. Tomcat demarrage d'instances multiple
    Par Jacques - 06 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 10/06/2008, 14h09
  3. Réponses: 1
    Dernier message: 03/02/2008, 18h05
  4. [kate] interdire les instances multiples
    Par Eusebius dans le forum KDE
    Réponses: 0
    Dernier message: 24/08/2007, 11h45
  5. Instances multiples du meme objet
    Par jbjweb dans le forum wxPython
    Réponses: 3
    Dernier message: 26/02/2007, 10h34

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