Tkinter, Toplevel image blanche

Fermé
ouiIRL - Modifié le 20 janv. 2023 à 13:54
ouiIRL Messages postés 3 Date d'inscription jeudi 19 janvier 2023 Statut Membre Dernière intervention 20 janvier 2023 - 20 janv. 2023 à 10:52

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

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 jeudi 19 janvier 2023 Statut Membre Dernière intervention 20 janvier 2023
20 janv. 2023 à 10:52

merci beaucoup ^^

0

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 jeudi 19 janvier 2023 Statut Membre Dernière intervention 20 janvier 2023
19 janv. 2023 à 21:26

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

0

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 jeudi 19 janvier 2023 Statut Membre Dernière intervention 20 janvier 2023
19 janv. 2023 à 21:26

fail les "???"

0