1 pièce(s) jointe(s)
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:
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:
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
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!!!!!