Changement de canvas
Firesta
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
Firesta Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
Firesta Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
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 :
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 :
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 !
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:
- Changement de canvas
- Changer de dns - Guide
- Canvas gratuit - Télécharger - Divers Photo & Graphisme
- Changement d'écriture facebook - Guide
- Changement d'heure - Guide
- Changement clavier azerty - Guide
1 réponse
Bonjour.
La 1ère erreur se situe par le fait que tu appelles
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.
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.
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 !