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.

Python Tkinter con Turtle y Scrollbars

He estado teniendo algunos problemas al implementar barras de desplazamiento en mi programa Tkinter que utiliza turtle. Puedo crear y agregar el lienzo de turtle a mi programa Tkinter sin problemas, sin embargo, las barras de desplazamiento no parecen ajustarse visualmente, aunque se pueden arrastrar. El lienzo también comienza descentrado, lo que significa que tienes que desplazarlo al centro cada vez. A continuación se muestra un ejemplo de este problema.

Screenshot

Sé que podría usar “Scrolledcanvas” incorporado en turtle, sin embargo, esto significaría que no puedo estilizar las barras de desplazamiento utilizando ttk. Si es posible, me gustaría eliminar las barras de desplazamiento por completo y simplemente centrar los gráficos y hacer que se ajusten al lienzo en todo momento, sin embargo, esto me pareció demasiado complejo.

He proporcionado un ejemplo funcional a continuación para que cualquiera pueda ver.

import tkinter as tk
from tkinter import ttk
import turtle

root = tk.Tk()

aFrame = tk.Canvas(root)
aFrame.pack()

aCanvas = tk.Canvas(aFrame)
aCanvas.grid(row=0, column=0, sticky="")

aScreen = turtle.TurtleScreen(aCanvas)

aXScrollbar = ttk.Scrollbar(aFrame, orient="horizontal", command=aCanvas.xview)
aXScrollbar.bind("<configure>",
                 lambda e: aCanvas.configure(
                     scrollregion=aCanvas.bbox("all")
                 ))
aXScrollbar.grid(row=1, column=0, sticky="ew")

aYScrollbar = ttk.Scrollbar(aFrame, orient="vertical", command=aCanvas.yview)
aYScrollbar.bind("<configure>",
                 lambda e: aCanvas.configure(
                     scrollregion=aCanvas.bbox("all")
                 ))
aYScrollbar.grid(row=0, column=1, sticky="ns")

aTurtle = turtle.RawTurtle(aScreen)
aTurtle.goto(0, 0)
aTurtle.fillcolor('blue')
aTurtle.begin_fill()
for i in range(4):
    aTurtle.forward(150)
    aTurtle.right(90)
aTurtle.end_fill()

root.mainloop()

¡Gracias por cualquier ayuda!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que las barras de desplazamiento no se ajustan visualmente debido al método pack() utilizado en el lienzo aFrame. En lugar de utilizar pack(), puedes intentar utilizar el método grid() en el lienzo aFrame con un peso de fila y columna de 1 para que se expanda y llene toda la ventana principal. Esto hará que las barras de desplazamiento se ajusten y el lienzo comience centrado.

    Para eliminar las barras de desplazamiento y centrar los gráficos, puedes establecer el área de desplazamiento del lienzo al cuadro delimitador de los gráficos de la tortuga, y luego utilizar los métodos canvasx() y canvasy() del lienzo para calcular el punto central en coordenadas del lienzo. Luego puedes centrar los gráficos de la tortuga desplazándolos por la diferencia entre el punto central y el centro del lienzo.

    Aquí tienes un ejemplo de código actualizado:

    import tkinter as tk
    from tkinter import ttk
    import turtle
    
    root = tk.Tk()
    
    aFrame = tk.Frame(root)
    aFrame.grid(row=0, column=0, sticky="nsew")
    aFrame.rowconfigure(0, weight=1)
    aFrame.columnconfigure(0, weight=1)
    
    aCanvas = tk.Canvas(aFrame)
    aCanvas.grid(row=0, column=0, sticky="nsew")
    aCanvas.configure(scrollregion=(0, 0, 400, 400))
    
    aTurtle = turtle.RawTurtle(aCanvas)
    aTurtle.goto(0, 0)
    aTurtle.fillcolor('blue')
    aTurtle.begin_fill()
    for i in range(4):
        aTurtle.forward(150)
        aTurtle.right(90)
    aTurtle.end_fill()
    
    # calcular el centro del lienzo en coordenadas del lienzo
    center_x, center_y = aCanvas.canvasx(aCanvas.winfo_width() / 2), aCanvas.canvasy(aCanvas.winfo_height() / 2)
    
    # calcular el centro de los gráficos de la tortuga en coordenadas de la tortuga
    graphics_bbox = aTurtle.boundingbox()
    graphics_center_x = (graphics_bbox[0] + graphics_bbox[2]) / 2
    graphics_center_y = (graphics_bbox[1] + graphics_bbox[3]) / 2
    
    # desplazar los gráficos de la tortuga para centrarlos en el lienzo
    x_offset = center_x - graphics_center_x
    y_offset = center_y - graphics_center_y
    aTurtle.setpos(aTurtle.pos() + (x_offset, y_offset))
    
    root.mainloop()
    

    Este código establece la scrollregion del lienzo en (0, 0, 400, 400) para que coincida con el tamaño de los gráficos de la tortuga. Luego calcula el punto central del lienzo en coordenadas del lienzo utilizando los métodos canvasx() y canvasy(). También calcula el punto central de los gráficos de la tortuga en coordenadas de la tortuga utilizando el método boundingbox(). Finalmente, calcula el desplazamiento necesario para centrar los gráficos de la tortuga en el lienzo y utiliza el método setpos() para desplazar los gráficos de la tortuga al centro del lienzo.

    Ten en cuenta que este código centra los gráficos de la tortuga en el lienzo al iniciar el programa, pero si se modifican o cambian los gráficos, será necesario recalcular el centrado.

Comments are closed.