【发布时间】:2018-01-02 14:27:09
【问题描述】:
我在这里有一组代码,每次运行代码时我都会使用它来生成唯一的图像;如何将其设置为仅在 tkinter 屏幕的边界内绘制?
代码如下:
import random
import turtle
maker=turtle.Turtle()
maker.getscreen().delay(0)
maker.getscreen().tracer(0)
n=random.randint(1,360)
m=random.randint(0,100)
r=random.randint(0,50)
d=random.randint(1,2)
maker2=maker.clone()
maker3=maker.clone()
maker4=maker.clone()
maker.goto(0,0)
maker2.goto(0,0)
maker3.goto(0,0)
maker4.goto(0,0)
#top right
maker.goto(50, 50)
#bottom right
maker2.goto(50, -50)
#bottom left
maker3.goto(-50, -50)
#top left
maker4.goto(-50, 50)
while r<50:
for i in range (0,m):
maker.forward(m)
maker2.forward(m)
maker3.backward(m)
maker4.backward(m)
for i in range (0,r):
if d == 1:
maker.right(n)
maker2.right(n*-1)
maker3.left(n*-1)
maker4.left(n)
elif d == 2:
maker.left(n)
maker2.left(n*-1)
maker3.right(n*-1)
maker4.right(n)
maker.forward(m)
maker2.forward(m)
maker3.backward(m)
maker4.backward(m)
n=n+1
r = r + 1
n=random.randint(0,359)
maker.goto(0,0)
maker2.goto(0,0)
maker3.goto(0,0)
maker4.goto(0,0)
turtle.exitonclick()
【问题讨论】:
-
您可以获得当前位置和“添加”值,您将在
forward中使用(也使用angle和sin(),cos())在移动之前获取目标位置。然后你可以检查目的地是否在束缚中。如果不是,则跳过移动或在forward中使用较小的值。 -
如果您注意到,代码本身并没有一遍又一遍地绘制相同的东西,因为它会随机设置自己的方向和前进值,我无法设置更短的“前进” ' 并且实际上仍将其保留在屏幕中,因为它可能会选择仅前进多次相同的数字。方向值不会使它转动;等等我也希望将窗口设置为 tkinter 屏幕值,而不是设置的像素数,所以在不同的计算机上,这可能会有所不同。我想让它知道,如果它碰到画布的边缘,它需要达到另一个值并以其他方式转动。怎么样?
-
移动的随机性无关紧要-您可以在使用
forward()之前获取m并计算dx = m*sin(angel)dy = m*cos(angle)并添加到当前位置x,y = pos() ; x += dx ; y += dy以获得目的地位置。您还可以随时获取画布大小(canvas['width']、canvas['height'])并检查x,y是否仍在画布中。 -
谢谢;检查画布并在另一个 if 语句中运行整个循环可能会起作用。
-
将绘图(大部分)保留在画布的可见部分的一种简单方法是创建一个函数,在移动每个海龟后对其进行测试,如果它离中心太远,移动它朝向中心。例如,如果海龟是
t,您可以使用x, y = t.position()if abs(x) > width or abs(y) > height: t.goto(x / 2, y / 2)。但是,这会使许多图形非常密集,因此您需要减小某些参数的范围。
标签: python tkinter turtle-graphics