库可能有Arc类与Circle类相似,或者可能是限制Circle对象只显示(填充)弧的方法,或者相似的东西。如果是这样,为了获得半圆,您可以使用Arc(centre, 20, -math.pi/2, math.pi/2)和Arc(centre, 20, math.pi/2, 3*math.pi/2)之类的内容。

库可以设置显式边界框以截断任何对象。所以,你可以这样做:bb = circle.getBoundingBox(); bb.top = (bb.top + bb.bottom) / 2; circle.setBoundingBox(bb)。

图书馆可能没有任何明确的方法可以做到这一点,但可以让你在Z顺序中的其他东西之上绘制东西。所以,首先你画出五个完整的圆圈,然后画一个大的白色矩形,覆盖所有圆圈的下半部分。 (如果有办法设置边框颜色以及填充颜色,那甚至可以免费提供那些矩形线条。)

图书馆根本无法做到这一点,在这种情况下你必须使用不同的图书馆。

醇>

同时,对于“我将如何让代码沿y轴重复”,这只是你已经拥有的那个循环之外的另一个循环。像这样:

def fdShape():
win = GraphWin("pdShape",200,200)
centre = Point(20,100)
for y in range(9):
for x in range(5):
circle = Circle(centre, 20)
circle.setFill("red")
centre = Point((centre.getX() + 40), centre.getY())
circle.draw(win)
centre = Point(20, centre.getY() + 40)

但是,从x和y创建点而不是明确地添加它们可能会更好:

for y in range(9):
for x in range(5):
centre = Point(x * 40 + 20, y * 40 + 60)
circle = Circle(centre, 20)
circle.setFill("red")
circle.draw(win)

看the library link you gave in the comments,似乎没有任何方法可以做1或2.完整的文档在我没有的教科书中,但有reference docs在线,而且代码非常简单。 Circle或其任何父类都没有任何方法可以指定弧,或者是要截断的框。 (有一个边界框,但是切成两半会导致压扁椭圆的一半高度,而不是半圆。)

并且大概你正在学习一门需要这个库的课程,所以4不是一个选择。

哪一个离开3.这意味着你实际上必须稍微改变一下。像这样:

for y in range(4):
# draw row of circles y
# draw row 8-y
# draw rectangle y
# draw rectangle 8-y
# draw row of circles 4

请注意,矩形3和矩形5将是相同的,因此绘制两者都有点浪费,但我认为在这种情况下,保持代码更简单是值得浪费的。如果您的老师不同意,那么弄清楚如何重构代码应该很容易。

最后,谈到重构代码,假设您必须使用不同的值两次“绘制圆圈”,您应该将其转换为函数,同样适用于“绘制矩形”。然后上面的伪代码变成实际代码:

for y in range(4):
drawRowOfCircles(win, y)
drawRowOfCircles(win, 8-y)
drawRectangle(win, y)
drawRectangle(win, 8-y)
drawRowOfCircles(win, 4)