Changement de canvas

Fermé
Firesta Messages postés 2 Date d'inscription mercredi 14 mars 2018 Statut Membre Dernière intervention 21 mars 2018 - 20 mars 2018 à 19:32
Firesta Messages postés 2 Date d'inscription mercredi 14 mars 2018 Statut Membre Dernière intervention 21 mars 2018 - 21 mars 2018 à 08:46
Bonjour,

Je cherche à créer un mini-jeu, composé de plusieurs interfaces graphiques. J'ai déjà créé chacune d'entre elles ; je cherche à présent à les afficher l'une après l'autre, à l'aide de boutons, dans une même fenêtre.

J'arrive sans souci à passer de l'interface "Accueil" à l'interface "ME", grâce au code ci-dessous :
#ASSOCIATION DES INTERFACES

#Importation de bibliothèque
from tkinter import *

def ME():
#Définition du canvas et paramètres
    zoneME.place(x=0, y=0)
#Effacement bouton
    suite.place_forget()
#TEXTES
    titreME=zoneME.create_text(400, 50, fill="black", font="Lemon/Milk", text="EXPLICATIONS")
    intrME=zoneME.create_text(250, 100, fill="black", font="Garamond", text="TEXTE")
    jeu1=zoneME.create_text(350, 175, fill="black", font="Garamond", text="TEXTE")
    jeu2=zoneME.create_text(260, 270, fill="black", font="Garamond", text="TEXTE")
#Bouton
    suiteME=Button(fen,text="JOUER !", font="Tahoma")
    suiteME.place(x=150,y=520)

#Création de la fenêtre
fen=Tk()

#Définition des paramètres
fen.geometry("800x600")
fen.title("FRAGEÜZENTA")
fen.resizable(width=False, height=False)

#Définition du canvas et paramètres
zone=Canvas(fen, bg="purple", width="800", height="600")
zone.place(x=0, y=0)

#Récupération et positionnement de l'image dans le canvas
texture=PhotoImage(file="dragonfond.gif")
zone.create_image(100,500, image=texture)

#Création et paramètres du canvasME
zoneME=Canvas(fen, bg="yellow", width="800", height="600")
textureME=PhotoImage(file="Fondgif.gif") # → Image de fond
zoneME.create_image(700,350, image=textureME)
mascotte=PhotoImage(file="flammechebulles.gif")
zoneME.create_image(525,475, image=mascotte)

#TEXTES
titre=zone.create_text(150, 50, fill="white", font="Lemon/Milk", text="BIENVENUE !")
intr=zone.create_text(180, 200, fill="white", font="Garamond", text="TEXTE")
expl=zone.create_text(150, 360, fill="white", font="Garamond", text="TEXTE")
suite=zone.create_text(90, 450, fill="white", font="Garamond", text="TEXTE")

#Bouton
suite=Button(fen,text="ACCÈS AU JEU...", font="Tahoma", command=ME)
suite.place(x=100,y=520)

#Lancement de la fenêtre
fen.mainloop()


J'ai commencé à monter ma troisième interface, "Chap1", sur le même modèle que la première : création du canvas dans le programme principal, puis placement de celui-ci et ajout des widgets qui le composent dans une fonction.
Problème : le bouton qui permet d'afficher "Chap1" est contenu dans la fonction appelant "ME". J'ai donc tenté de décomposer mes interfaces à 2 par fenêtres : en pratique, j'appuie sur "JOUER" sur l'interface "ME" et la fenêtre est détruite pour en ouvrir une nouvelle, qui contiendra les interfaces suivantes. Ce n'est clairement pas esthétique ni confortable, mais ce qui m'intéresse pour l'instant, c'est que ça fonctionne.
Voilà où j'en suis pour l'instant :

#ASSOCIATION DES INTERFACES

#Importation de bibliothèque
from tkinter import *

def ME():
#Définition du canvas et paramètres
    zoneME.place(x=0, y=0)
#Effacement bouton
    suite.place_forget()
#TEXTES
    titreME=zoneME.create_text(400, 50, fill="black", font="Lemon/Milk", text="EXPLICATIONS")
    intrME=zoneME.create_text(250, 100, fill="black", font="Garamond", text="TEXTE")
    jeu1=zoneME.create_text(350, 175, fill="black", font="Garamond", text="TEXTE")
    jeu2=zoneME.create_text(260, 270, fill="black", font="Garamond", text="TEXTE")
#Bouton
    suiteME=Button(fen,text="JOUER !", font="Tahoma")
    suiteME.place(x=150,y=520)

#Création de la fenêtre
fen=Tk()

#Définition des paramètres
fen.geometry("800x600")
fen.title("FRAGEÜZENTA")
fen.resizable(width=False, height=False)

#Définition du canvas et paramètres
zone=Canvas(fen, bg="purple", width="800", height="600")
zone.place(x=0, y=0)

#Récupération et positionnement de l'image dans le canvas
texture=PhotoImage(file="dragonfond.gif")
zone.create_image(100,500, image=texture)

#Création et paramètres du canvasME
zoneME=Canvas(fen, bg="yellow", width="800", height="600")
textureME=PhotoImage(file="Fondgif.gif") # → Image de fond
zoneME.create_image(700,350, image=textureME)
mascotte=PhotoImage(file="flammechebulles.gif")
zoneME.create_image(525,475, image=mascotte)

#TEXTES
titre=zone.create_text(150, 50, fill="white", font="Lemon/Milk", text="BIENVENUE !")
intr=zone.create_text(180, 200, fill="white", font="Garamond", text="TEXTE")
suite=zone.create_text(90, 450, fill="white", font="Garamond", text="TEXTE")

#Bouton
suite=Button(fen,text="ACCÈS AU JEU...", font="Tahoma", command=ME)
suite.place(x=100,y=520)

#Lancement de la fenêtre
fen.mainloop()

#Destruction fenêtre et création Chap 1
fen.destroy()
#Création de la fenêtre1
fen1=Tk()
#Définition des paramètres
fen1.geometry("800x600")
fen1.title("Chapitre 1 : Héritage")
fen1.resizable(width=False, height=False)
#Création et paramètres Canvas1
zone1=Canvas(fen1, bg="Orchid", width="800", height="600")
zone.place(x=0, y=0)
texture1=PhotoImage(file="textgif.gif")
zone1.create_image(200,200, image=texture1)
#TEXTES
titre1=zone1.create_text(375, 50, fill="white", font="Lemon/Milk", text="TEXTE")
intr1=zone1.create_text(375, 90, fill="white", font="j.d.", text="TEXTE")
hist1=zone1.create_text(375, 300, fill="black", font="Hughs", text="TEXTE")
#Bouton
suite1=Button(fen,text="Passez au niveau suivant pour accéder à la suite de l'histoire !", font="Tahoma") # + command="Jeu"
suite1.place(x=330,y=550)

fen1.mainloop()


Les deux interfaces s'affichent comme dans le premier programme, puis la console m'annonce que "tkinter.TclError: can't invoke "destroy" command: application has been destroyed".

Est-ce que quelqu'un peut m'indiquer une façon de faire plus simple et qui fonctionne ?

Merci d'avance !
A voir également:

1 réponse

Bonjour.

La 1ère erreur se situe par le fait que tu appelles
fen.destroy 
[L56] après le mainloop, évidemment fen n'existe plus, puisque la boucle évenementielle de tkinter est terminée.

Les autres erreurs viennent du fait que tu as utilisé fen, et non fen1 [L73].

Bon, sinon, ce n'est pas envisageable de continuer ainsi, créer 50 fois une nouvelle fenêtre master n'est pas maintenable.
Ce n'est pas comme ça que l'on doit procéder, déjà au lieu de créer toutes ces instances de nouvelles créations de fenêtres, tu peux commencer à coller tout ça dans des frames, ça change rien à l'affaire, et ça commencera à être plus propre.
0
Firesta Messages postés 2 Date d'inscription mercredi 14 mars 2018 Statut Membre Dernière intervention 21 mars 2018
21 mars 2018 à 08:46
Re-bonjour,

Merci pour ces précisions, mon programme est assez brouillon à cause de toutes les instructions qui se ressemblent et c'était prévisible que je m'emmêle les pinceaux...

Je vais réécrire le programme avec des frames, comme conseillé. Je n'avais pas développé cette notion en cours, ce qui explique que je n'y ai pas eu recours auparavant...

Merci !
0