Imagen blanca en Toplevel de Tkinter
ouiIRL Mensajes publicados 3 Estado Miembro -
Hola,
Estoy intentando programar un juego. Estoy enfrentando un problema, después de haber utilizado una buena docena de técnicas o después de haber mirado muchos foros, no lo he resuelto.
El problema es el siguiente:
- abro una ventana que tiene un botón;
- ese botón llama a una función que oculta la ventana principal y abre otra;
- pero al abrir la segunda ventana, aparece una ventana blanca.
Aquí está la parte problemática del código:
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="Atacar", bg="red", fg="orange") inv_button = Button(DG, text="Inventario", bg="blue", fg="purple") fuir_button = Button(DG, text="Huir", 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="¿Qué quieres hacer?", 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() Además, cuando intento poner un título o cualquier parámetro en mi ventana top level, me muestra un mensaje de error diciendo que la opción no funciona.
Realmente necesito ayuda, estoy bloqueado desde hace dos días.
Gracias de antemano.
4 respuestas
Aquí hay un ejemplo muy básico de cómo alternar de un contenido a otro.
import tkinter as tk # Función de intercambio de contenidos de la ventana def frame_switch(): # winfo_ismapped indica si un widget está « packed » if main_frame.winfo_ismapped(): window.title('Segunda frame') # Desempaquetar la frame y empaquetar la otra main_frame.pack_forget() second_frame.pack() else: window.title('Frame Principal') second_frame.pack_forget() main_frame.pack() window = tk.Tk() window.geometry('400x200') window.title('Frame Principal') # Frame visible al inicio 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='Hacia blabla', command=frame_switch) switch_button.pack() # Frame invisible al inicio y su contenido 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='Regresar', command=frame_switch) back_button.pack() window.mainloop() Si entiendes el principio, no tendrás ningún problema en adaptarlo a tu necesidad.
Buena continuación.
Hola, debería hacerse un ejemplo fácilmente reproducible, no tenemos tus imágenes, además el tamaño de la ventana es considerable.
Entonces, ¿por qué usar un lienzo para colocar tus widgets?
Ahora, si comentamos todas las partes de las imágenes, eso "funciona".
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="Atacar", bg="red", fg="orange") inv_button = Button(DG, text="Inventario", bg="blue", fg="purple") fuir_button = Button(DG, text="Huir", 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 # derecha = PhotoImage(file="flechaDerechaS.png") # derecha.config(width="174", height="100") # izquierda = PhotoImage(file="flechaIzquierdaS.png") # izquierda.config(width="174", height="100") # elección = PhotoImage(file="eleccion.png") canva = Canvas(win, width=width, height=height) # canva.create_image(width, height, image=eleccion,anchor="se") label_start = Label(win, text="¿Qué quieres hacer?", font=("Comic Sans MS", 20, "bold"), bg="#5db6ce", fg="white") canva.create_window(200, 200, window=label_start) canva.pack() FlechaDerecha = Button(win,text='D', command=open_toplevel) # FlechaDerecha.config(image=derecha) FlechaDerecha.pack() canva.create_window(200, 400, window=FlechaDerecha) FlechaIzquierda = Button(win,text='G', command=open_toplevel) # FlechaIzquierda.config(image=izquierda) FlechaIzquierda.pack() canva.create_window(300, 400, window=FlechaIzquierda) win.mainloop() Lo que buscas hacer es modificar el contenido de la ventana principal, ¿no?
En ese caso, debes asignar cada contenido a diferentes marcos, y según lo que quieras que se muestre, empacar y desempacar esos marcos.
muchas gracias ^^