Imagen blanca en Toplevel de Tkinter

ouiIRL -  
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

jouflu
 

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.

1
ouiIRL Mensajes publicados 3 Estado Miembro
 

muchas gracias ^^

0
jouflu
 

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.

0
ouiIRL Mensajes publicados 3 Estado Miembro
 

muchas gracias, ahora solo tengo que ver una buena hora de cómo usar los frames????

0
jouflu
 

Los frames no son más que contenedores para otros widgets, es fácil de usar, lo más complejo es utilizar los gestores de colocación como pack o grid.

0
ouiIRL Mensajes publicados 3 Estado Miembro
 

fallar los "???"

0