es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear una cuadrícula y luego colorearla siguiendo el escenario dado en tkinter.

Quiero crear una cuadrícula y colorear algunas celdas secuencialmente para que el usuario pueda ver cómo se encienden las celdas.

Por el momento tengo:

from tkinter import *

center=Tk()
center.geometry('455x455')
center.title("Cuadrícula 9x9")

cells = {}
for row in range(9):
     for column in range(9):
        cell = Frame(center, bg='white', highlightbackground="black",
                     highlightcolor="black", highlightthickness=1,
                     width=50, height=50,  padx=3,  pady=3)
        cell.grid(row=row, column=column)
        cells[(row, column)] = cell

def color_cell(cells, i, j, color="red"):
    cells[(i,j)].configure(background=color)

center.after(5000, color_cell(cells, 3, 4))

center.mainloop()

El problema es que espero 5000ms antes de ver todo. Quiero ver primero la cuadrícula en blanco y luego, después de 5000ms, una de las celdas se vuelve roja. El objetivo final es poder ilustrar un algoritmo de percolación (por lo que la visualización debe ser eficiente). Por el momento elegí Tkinter, pero eso puede ser demasiado, si tienes una alternativa más simple, estoy dispuesto a escuchar. Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes usar el método after() para retrasar la coloración de la celda. Primero, puedes crear una función que se ejecutará después del retraso, y dentro de esa función, puedes llamar a la función color_cell() para colorear una celda específica en la cuadrícula. Luego, puedes llamar al método after() para programar la ejecución de esa función después de 5000ms, una vez que se muestre la cuadrícula vacía. Aquí tienes un fragmento de código actualizado:

    from tkinter import *
    
    center=Tk()
    center.geometry('455x455')
    center.title("Cuadrícula de 9x9")
    
    cells = {}
    for row in range(9):
         for column in range(9):
            cell = Frame(center, bg='white', highlightbackground="black",
                         highlightcolor="black", highlightthickness=1,
                         width=50, height=50,  padx=3,  pady=3)
            cell.grid(row=row, column=column)
            cells[(row, column)] = cell
    
    def color_cell(cells, i, j, color="red"):
        cells[(i,j)].configure(background=color)
    
    def color_first_cell():
        color_cell(cells, 3, 4)
    
    center.after(5000, color_first_cell)
    
    center.mainloop()
    

    Este código mostrará la cuadrícula vacía de inmediato y después de 5000ms, la celda en el centro de la cuadrícula se volverá roja. Puedes modificar la función color_first_cell() para colorear diferentes celdas de manera secuencial, utilizando un bucle u cualquier otra lógica. En cuanto a una alternativa más simple a Tkinter, puedes considerar el uso de Pygame o Turtle graphics, que también son bibliotecas populares de Python para crear gráficos y animaciones simples.

Comments are closed.