在Python Turtle中将圆圈半径与窗口大小联系起来

时间:2018-05-23 02:07:13

标签: python drawing turtle-graphics

在Python龟中,当在屏幕上绘制对象时,是否有办法让圆的半径连接到窗口的宽度或高度,以便通过改变窗口大小来调整它的大小?

2 个答案:

答案 0 :(得分:0)

是的,这是可能的。

您将需要创建一个乌龟将要收听的事件:在下面的示例中,如果您单击乌龟,将绘制一个宽度为画布宽度一半的圆圈。
如果你调整画布的大小,然后再次点击乌龟,则会有一半的新圆圈 新的宽度将被重新绘制。

import turtle


def start(dummy_a, dummy_b):
    t.reset()
    y, x = screen.window_height(), screen.window_width()
    t.home()
    t.circle(x/4)


if __name__ == '__main__':

    screen = turtle.Screen()
    t = turtle.Turtle()

    t.onclick(start, add=True)
    screen.listen()
    turtle.done()

答案 1 :(得分:0)

这是我的替代点击调整绘图以调整窗口大小解决方案:

from turtle import Turtle, Screen

def onResize(x=0, y=0):
    screen.onclick(None)  # disable events inside event handler

    screen.setworldcoordinates(-1, -1, 1, 1)

    screen.onclick(onResize)

screen = Screen()
onResize()  # establish initial coordinate system

turtle = Turtle(visible=False)

turtle.penup()
turtle.sety(-0.5)
turtle.pendown()
turtle.circle(0.5, steps=30)

screen.mainloop()

请注意,我们重绘任何内容,我们只是重新调整我们的虚拟坐标(本例中为单位平方)并让乌龟重绘内容。如果我们愿意躲在幕后,我们可以更进一步:

import tkinter as tk
from turtle import RawTurtle, TurtleScreen, ScrolledCanvas

class MyTurtleScreen(TurtleScreen):

    def __init__(self, cv):
        super().__init__(cv)

        cv.bind('<Configure>', self.onResize)

    def onResize(self, event=None):
        self.setworldcoordinates(-1, -1, 1, 1)

root = tk.Tk()

canvas = ScrolledCanvas(root)
canvas.pack(fill=tk.BOTH, expand=tk.YES)

screen = MyTurtleScreen(canvas)
screen.onResize()  # establish initial coordinate system

turtle = RawTurtle(screen, visible=False)

turtle.penup()
turtle.sety(-0.5)
turtle.pendown()
turtle.circle(0.5, steps=30)

screen.mainloop()

这是tkinter 示例中的通用嵌入海龟,但我已自定义TurtleScreen以接受Configure事件。现在,当您调整窗口大小时,坐标系统技巧会在自动启动之前,因此您不需要点击窗口 - 它就会发生。