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.
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!
davy.ai
Parece que las barras de desplazamiento no se ajustan visualmente debido al método
pack()
utilizado en el lienzoaFrame
. En lugar de utilizarpack()
, puedes intentar utilizar el métodogrid()
en el lienzoaFrame
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()
ycanvasy()
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:
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étodoscanvasx()
ycanvasy()
. También calcula el punto central de los gráficos de la tortuga en coordenadas de la tortuga utilizando el métodoboundingbox()
. Finalmente, calcula el desplazamiento necesario para centrar los gráficos de la tortuga en el lienzo y utiliza el métodosetpos()
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.