【问题标题】:Python Turtle for loop running infinitelyPython Turtle for 循环无限运行
【发布时间】:2019-05-07 07:45:10
【问题描述】:

我有一些之前成功运行的 Turtle 代码,用于在 Repl.it 的 Python 中使用 Turtle IDE 绘制 Sierpinski 垫片,但最近当我尝试再次运行它时,它成功地完成了所有操作,除非它击中for 循环,turtle 刚刚开始旋转,直到很久以后才执行 for 循环中的行。

我在 forloop 中添加了一个 print(i),它重复打印 0,就好像它是一个无限循环

import turtle
from turtle import *

t = Turtle()
t.speed(0)
t.shape('turtle')
t.color('dark green')

def SGRules(char):
  if char == 'F':
    return 'F+F-F-F+F'
  else:
    return char

def processStr(oldstr, Fractal_Rules):
  newstr = ""
  for char in oldstr:
    newstr = newstr + Fractal_Rules(char)
  return newstr

def createLSystem(iteration, axiom, Fractal_Rules):
  startstr = axiom
  endstr = ""
  for i in range(iteration):
    endstr = processStr(startstr, Fractal_Rules)
    startstr = endstr
  return endstr

def drawLSystem(aturtle, lsys, angle, length):
  for cmd in lsys:
    if cmd == 'F':
      aturtle.forward(length)
    elif cmd == '+':
      aturtle.left(angle)
    elif cmd == '-':
      aturtle.right(angle)

sgstr = createLSystem(4, 'F', SGRules)
print(sgstr)
drawLSystem(t, sgstr, 120, 20)
for i in range(2):
  print(i)
  t.left(120)
  t.forward(20 * 2**4)

它应该只绘制到达右下角后剩余的外三角形的两条边。

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    您的代码清理在 repl.it 和 Python 控制台中运行良好:

    from turtle import Screen, Turtle
    
    ANGLE = 120
    LENGTH = 20
    ITERATIONS = 4
    
    def SGRules(character):
        if character == 'F':
            return 'F+F-F-F+F'
    
        return character
    
    def processStr(string, rules):
        new_string = ""
    
        for character in string:
            new_string += rules(character)
    
        return new_string
    
    def createLSystem(iterations, axiom, rules):
        string = ""
    
        for _ in range(iterations):
            string = processStr(axiom, rules)
            axiom = string
    
        return string
    
    def drawLSystem(turtle, lsys, angle, length):
        for command in lsys:
            if command == 'F':
                turtle.forward(length)
            elif command == '+':
                turtle.left(angle)
            elif command == '-':
                turtle.right(angle)
    
    yertle = Turtle('turtle')
    yertle.speed('fastest')
    yertle.shape('turtle')
    yertle.color('dark green', 'light green')
    
    sg_string = createLSystem(ITERATIONS, 'F', SGRules)
    print(sg_string)
    drawLSystem(yertle, sg_string, ANGLE, LENGTH)
    
    for _ in range(2):
        yertle.left(ANGLE)
        yertle.forward(LENGTH * 2 ** ITERATIONS)
    
    screen = Screen()
    screen.mainloop()
    

    虽然我在末尾添加了对 tkinter 事件循环的传输以防止窗口关闭,但您的原始代码在 Python 控制台中运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2017-06-20
      相关资源
      最近更新 更多