Tkinter, Toplevel image blanche

ouiIRL -  
ouiIRL Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

J'essaye de programmer un jeu. Je suis confronté à un problème, après avoir une bonne dizaine de technique ou après avoir regardé plein de forum, je ne l'ai pas résolu.

Le problème est le suivant :

  • j'ouvre une fenêtre qui comporte un bouton ;
  • ce bouton appelle une fonction qui cache la fenêtre principale et en ouvre une autre ;
  • mais lors de l'ouverture de la deuxième fenêtre, une fenêtre blanche s'affiche.

Voici la partie problématique du code:

from tkinter import *


def open_toplevel():
    global choix_on
    if choix_on == True:
        choix_on = False
    else:
        choix_on = True
    if choix_on == False:
        win.withdraw()
        DG = Toplevel(win)
        width = 1920
        height = 1080
        canvas = Canvas(DG, width=width, height=height)
        canvas.pack()
        fight = PhotoImage(file="fight.png")
        fight.config(width=width, height=height)
        canvas.create_image(0, 0, image=fight, anchor="se")
        atk = Button(DG, text="Attaquer", bg="red", fg="orange")
        inv_button = Button(DG, text="Inventaire", bg="blue", fg="purple")
        fuir_button = Button(DG, text="Fuir", bg="green", fg="yellow")
        canvas.create_window(200,400, window=atk)
        canvas.create_window(200, 425, window=inv_button)
        canvas.create_window(200, 450, window=fuir_button)



win = Tk()
win.geometry("1920x1080")
choix_on = True
width = 1920
height = 1080

droite = PhotoImage(file="flècheDroiteS.png")
droite.config(width="174", height="100")

gauche = PhotoImage(file="flecheGaucheS.png")
gauche.config(width="174", height="100")

choix = PhotoImage(file="choix.png")
canva = Canvas(win, width=width, height=height)
canva.create_image(width, height, image=choix,anchor="se")
label_start = Label(win, text="Que voulez vous faire ?",
                    font=("Comic Sans MS", 20, "bold"), bg="#5db6ce", fg="white")
canva.create_window(960, 100, window=label_start)
canva.pack()

FlecheDroite = Button(win,command=open_toplevel)
FlecheDroite.config(image=droite)
FlecheDroite.pack()
canva.create_window(1400, 600, window=FlecheDroite)

FlecheGauche = Button(win,command=open_toplevel)
FlecheGauche.config(image=gauche)
FlecheGauche.pack()
canva.create_window(740, 500, window=FlecheGauche)


win.mainloop()

D'ailleurs, lorsque je souhaite mettre un titre ou quelque paramètre que ce soit à ma fenêtre top level, ça m'affiche un msg d'erreur disant que l'option ne marche pas.

J'ai vraiment besoin d'aide, je suis bloqué depuis deux jours dessus.

Merci d'avance.

4 réponses

jouflu
 

Voici un exemple très basique de comment basculer d'un contenu à un autre.

import tkinter as tk

# Fonction d'échange des contenus de la fenêtre
def frame_switch():
    # winfo_ismapped indique si un widget est « packed »
    if main_frame.winfo_ismapped():
        window.title('Seconde frame')
        # Unpacking de la frame et packing de l'autre
        main_frame.pack_forget()
        second_frame.pack()
    else:
        window.title('Frame Principale')
        second_frame.pack_forget()
        main_frame.pack()


window = tk.Tk()
window.geometry('400x200')
window.title('Frame Principale')

# Frame visible au lancement
main_frame = tk.Frame(window)
main_frame.pack()

info_label = tk.Label(main_frame, text='info blabla', bg='blue', fg='white')
info_label.pack()

switch_button = tk.Button(main_frame, text='Vers blabla', command=frame_switch)
switch_button.pack()


# Frame invisible au lancement et son contenu
second_frame = tk.Frame(window)

blabla_text = tk.Text(second_frame, width=50, height=7)
blabla_text.pack()
blabla_text.insert(0.0, 'blabla\n' * 5)

back_button = tk.Button(second_frame, text='Revenir', command=frame_switch)
back_button.pack()


window.mainloop()

Si tu comprends le principe, tu n'auras aucun mal à l'adapter à ton besoin.

Bonne continuation.

1
ouiIRL Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 

merci beaucoup ^^

0
jouflu
 

Salut, il faudrait faire un exemple facilement reproductible, nous n'avons pas tes images, de plus la taille de la fenêtre est conséquente.

Puis pourquoi utiliser un canvas pour placer tes widgets ?

Maintenant, si on mets en commentaires toutes les parties des images, cela « fonctionne ».

from tkinter import *


def open_toplevel():
    global choix_on
    if choix_on == True:
        choix_on = False
    else:
        choix_on = True
    if choix_on == False:
        # win.withdraw()
        DG = Toplevel(win)
        width = 800
        height = 600
        canvas = Canvas(DG, width=width, height=height)
        canvas.pack()
        # fight = PhotoImage(file="fight.png")
        # fight.config(width=width, height=height)
        # canvas.create_image(0, 0, image=fight, anchor="se")
        atk = Button(DG, text="Attaquer", bg="red", fg="orange")
        inv_button = Button(DG, text="Inventaire", bg="blue", fg="purple")
        fuir_button = Button(DG, text="Fuir", bg="green", fg="yellow")
        canvas.create_window(200,400, window=atk)
        canvas.create_window(200, 425, window=inv_button)
        canvas.create_window(200, 450, window=fuir_button)



win = Tk()
# win.geometry("1920x1080")
choix_on = True
width = 800
height = 600

# droite = PhotoImage(file="flècheDroiteS.png")
# droite.config(width="174", height="100")

# gauche = PhotoImage(file="flecheGaucheS.png")
# gauche.config(width="174", height="100")

# choix = PhotoImage(file="choix.png")
canva = Canvas(win, width=width, height=height)
# canva.create_image(width, height, image=choix,anchor="se")
label_start = Label(win, text="Que voulez vous faire ?",
                    font=("Comic Sans MS", 20, "bold"), bg="#5db6ce", fg="white")
canva.create_window(200, 200, window=label_start)
canva.pack()

FlecheDroite = Button(win,text='D', command=open_toplevel)
# FlecheDroite.config(image=droite)
FlecheDroite.pack()
canva.create_window(200, 400, window=FlecheDroite)

FlecheGauche = Button(win,text='G', command=open_toplevel)
# FlecheGauche.config(image=gauche)
FlecheGauche.pack()
canva.create_window(300, 400, window=FlecheGauche)


win.mainloop()

Ce que tu cherches à faire est de modifier le contenu de la fenêtre principale non ?

En ce cas, il faut affecter chacun des contenus à différentes frames, et selon ce que tu veux qu'il s'affiche, pack et unpack ces frames.

0
ouiIRL Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 

merci beaucoup maintenant j'ai juste à regarde une bonne heure de comment utiliser les frames????

0
jouflu
 

Les frames ne sont que des conteneurs aux autres widgets, c'est fastoche à utiliser, le plus complexe est d'utiliser les gestionnaires de placements comme pack ou grid.

0
ouiIRL Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 

fail les "???"

0