Python-Turtle:无法通过圆形和矩形的文件进行解释并正确绘制

时间:2015-10-18 22:06:01

标签: python function while-loop turtle-graphics

下面的代码是3个函数和一个while循环来调用这些函数:

draw_rect():根据给定的参数绘制一个矩形

draw_circle():根据给定参数绘制一个圆圈

draw_line():根据给定参数绘制一条线

我的所有功能都能正常工作,并且可以读取只有矩形,只有行或只有圆圈的文本文件。

我在底部的循环是我遇到麻烦的地方。我有一个带有矩形和圆圈的文件,最终是一个python徽标。我无法弄清楚在while循环中需要做什么同时执行正确的函数。任何帮助将非常感激。我已经使用了.xt实现了txt文件的样本。

颜色为蓝色

圈-30 0 80

圈0 30 80

黄色

圈30 0 80

圈0 -30 80

颜色为蓝色

rect -84 55 60 110

rect -84 55 25 120

rect -30 80 88 82

颜色黑色

圈-20 -35 38

黄色

圈圈-20 -35 32

颜色黑色

rect -58 -40 5 100

def draw_rect():
    smart = turtle.Turtle()
    i=0
    while i < len(file_list):

        if file_list[i] != "":

                rect = file_list[i]
                if rect[0] != 'rect':
                    return i
                else:
                    color        = str(rect[1])
                    x_coordinate = int(rect[2])
                    y_coordinate = int(rect[3])
                    width        = int(rect[4])
                    height       = int(rect[5])
                    smart.penup()
                    smart.fillcolor(color)
                    smart.begin_fill()
                    smart.goto(x_coordinate, y_coordinate)
                    smart.setheading(0)
                    smart.pendown()
                    smart.forward(width)
                    smart.right(90)
                    smart.forward(height)
                    smart.right(90)
                    smart.forward(width)
                    smart.right(90)
                    smart.forward(height)
                    smart.end_fill()
                    i += 1
    return i

def draw_circle():
    smart = turtle.Turtle()
    i=0
    while i < len(file_list):
        if file_list[i] != "":
                circ = file_list[i]
                if circ[0] != 'circle':
                    return i
                else:
                    color        = str(circ[1])
                    x_coordinate = int(circ[2])
                    y_coordinate = int(circ[3])
                    radius       = int(circ[4])
                    smart.penup()
                    smart.fillcolor(color)
                    smart.begin_fill()
                    smart.goto(x_coordinate, y_coordinate)
                    smart.setheading(0)
                    smart.pendown()
                    smart.circle(radius)
                    smart.end_fill()
                    i += 1
    return i

def draw_line():
    smart = turtle.Turtle()
    i=0
    while i < len(file_list):
        if file_list[i] != "":
            star = file_list[i]
            if start[0] != 'line':
                return i
            else:
                color        = str(star[1])
                x_coordinate = int(star[2])
                y_coordinate = int(star[3])
                angle        = int(star[4])
                line_length  = int(star[5])            
                smart.penup()
                smart.color(color)
                smart.goto(x_coordinate, y_coordinate)
                smart.setheading(angle)
                smart.pendown()
                smart.forward(line_length)
                i += 1
    return i

import turtle
turtle.speed(0)

file = input("What file would you like to execute?")
turtle.clearscreen()
with open(str(file),'r') as f:
    file_list = []
    for line in f:
        if line == '\n': 
            continue

        l = line.split()
        if l[0].lower() == 'color':
            color = l[1].lower()
        else:
            file_list.append([l[0].lower()] + [color] + l[1:])
print(file_list[0:])
n = 0
i = 0
while n < len(file_list):
    n = n + i
    while file_list[n] != "":
            parameter = file_list[n]
            print(parameter[0])
            if parameter[0] != 'line' or parameter[0] != 'circle':
                draw_rect()

            elif parameter[0] != 'line' or parameter[0] != 'rect':
                draw_circle()

            elif parameter[0] != 'circle' or parameter[0] != 'rect':
                draw_line()





print("Program complete")

1 个答案:

答案 0 :(得分:1)

你的逻辑错了:

        if parameter[0] != 'line' or parameter[0] != 'circle':
            draw_rect()

        elif parameter[0] != 'line' or parameter[0] != 'rect':
            draw_circle()

        elif parameter[0] != 'circle' or parameter[0] != 'rect':
            draw_line()

您的意思是and而不是or。假设参数是'circle'。当行

        if parameter[0] != 'line' or parameter[0] != 'circle':
            draw_rect()
执行

,参数不等于'line',因此执行draw_rect。第二个条款从未被评估过。

但这是奇怪的代码。你为什么不把它改成

        if parameter[0] =='rect':
            draw_rect()

        elif parameter[0] == 'circle':
            draw_circle()

        elif parameter[0] == 'line':
            draw_line()

当然这更清楚了吗?

编辑:我重新组织了代码,我认为你会同意它更容易理解。它当然更短。最大的变化是

1)将绘图参数作为参数传递给绘图函数,而不是将它们保存在全局数组中。 2)使用迭代器处理文件中的行:for line in file这样,您不必弄乱索引或担心有多少行。
3)注意我如何将行中的条目转换为整数,例如x, y, width, height = map(int, line[1:])有些人不喜欢 map。他们会写类似

的东西
x,y,width,height == [int(item) for item in line[1:]]

无论漂浮在你的船上。

import turtle

def draw_rect(color, x, y, width, height):
     smart.penup()
     smart.fillcolor(color)
     smart.begin_fill()
     smart.goto(x, y)
     smart.setheading(0)
     smart.pendown()
     smart.forward(width)
     smart.right(90)
     smart.forward(height)
     smart.right(90)
     smart.forward(width)
     smart.right(90)
     smart.forward(height)
     smart.end_fill()

def draw_circle(color, x, y, radius):
     smart.penup()
     smart.fillcolor(color)
     smart.begin_fill()
     smart.goto(x, y)
     smart.setheading(0)
     smart.pendown()
     smart.circle(radius)
     smart.end_fill()

def draw_line(color, x, y, angle, length ):           
     smart.penup()
     smart.color(color)
     smart.goto(x, y)
     smart.setheading(angle)
     smart.pendown()
     smart.forward(line_length)

turtle.speed(0)
file = input("What file would you like to execute?")
turtle.clearscreen()
smart = turtle.Turtle()

with open(str(file),'r')  as f:
     color = 'black'    #default
     for line in f:
          line = line.strip().split()
          if  line[0] == 'color':
               color = line[1]
          elif line[0] == 'rect':
               x, y, width, height = map(int, line[1:])
               draw_rect(color, x, y, width, height)
          elif line[0] == 'circle':
               x,y, radius = map(int, line[1:])
               draw_circle(color, x, y, radius)
          elif line[0] == 'line':
               x, y, angle, length = map(int, line[1:])
               draw_line(color, x, y, angle, length)

input("Press Enter to exit")               
print("Program complete")

请注意,这大部分都是您的代码;我刚刚清理了一下。 “我每天都在变得更好”是正确的态度!保持。我的经验以及整个程序员的经验是,在节省调试和以后的维护时,您花费的时间使程序清晰可读得到了充分的回报。即使付出了我所付出的努力,我也无法计算六个月后我查看我的代码的时间,并且想:“这应该做什么?”