Вырезать коды в программе и сделать ее аккуратнее - PullRequest
0 голосов
/ 08 января 2019

Я с трудом нарезаю код и превращаю его в цикл, чтобы он сделал код программы аккуратнее.

Хотя мой код работает так, как он должен быть, я думаю, что есть правильный способ его создания, добавив цикл for вместо написания всех этих кодов, я знаю, что есть простой способ сделать это, я просто не мог не понимаю, как это сделать правильно. Я знаю, что должен создать цикл for.

квадраты

from graphics import *

def main():
    win = GraphWin("Squares", 500, 500)


    rect = Rectangle(Point(0,500), Point(500,0))
    rect.setFill("Red")
    rect.draw(win)

    rect2 = Rectangle(Point(20,480), Point(480,20))
    rect2.setFill("white")
    rect2.draw(win)

    rect3 = Rectangle(Point(40,460), Point(460,40))
    rect3.setFill("red")
    rect3.draw(win)

    rect4 = Rectangle(Point(60,440), Point(440,60))
    rect4.setFill("white")
    rect4.draw(win)

    rect5 = Rectangle(Point(80,420), Point(420,80))
    rect5.setFill("red")
    rect5.draw(win)

    rect6 = Rectangle(Point(100,400), Point(400,100))
    rect6.setFill("white")
    rect6.draw(win)

    rect7 = Rectangle(Point(120,380), Point(380,120))
    rect7.setFill("red")
    rect7.draw(win)

    rect8 = Rectangle(Point(140,360), Point(360,140))
    rect8.setFill("white")
    rect8.draw(win)

    rect9 = Rectangle(Point(160,340), Point(340,160))
    rect9.setFill("red")
    rect9.draw(win)

    rect10 = Rectangle(Point(180,320), Point(320,180))
    rect10.setFill("white")
    rect10.draw(win)

    rect11 = Rectangle(Point(200,300), Point(300,200))
    rect11.setFill("red")
    rect11.draw(win)

    rect12 = Rectangle(Point(220,280), Point(280,220))
    rect12.setFill("white")
    rect12.draw(win)

Результаты показывают квадраты в какую-то пэчворк

enter image description here

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Если лоскутное одеяло - просто фон, и вы не планируете изменять его, вы можете использовать это:

from graphics import *

def main():
    win = GraphWin("Squares", 500, 500)

    i = 1
    for x in range(0, 221, 20):
        rect = Rectangle(Point(x, 500 - x), Point(500 - x,x))
        rect.setFill("red" if i % 2 else "white")
        rect.draw(win)
        i += 1
0 голосов
/ 10 января 2019

Альтернативный подход, который требует только рисования в два раза меньше прямоугольников из-за использования контура прямоугольника, чем другой цвет:

SQUARE, WIDTH = 500, 20

def main():
    win = GraphWin("Squares", SQUARE, SQUARE)

    save_config = dict(DEFAULT_CONFIG)

    DEFAULT_CONFIG.update(dict(outline='red', fill='white', width=WIDTH))

    for xy in range(WIDTH//2, SQUARE//2, WIDTH*2):
        Rectangle(Point(xy, SQUARE - xy), Point(SQUARE - xy, xy)).draw(win)

    DEFAULT_CONFIG.update(save_config)

Он полностью параметризован, поэтому вы можете подогнать его к квадрату другого размера или иметь полосы различной ширины, отрегулировав параметры SQUARE и WIDTH. Вместо того, чтобы рисовать 12 прямоугольников в чередующихся цветах с параметрами, установленными в настоящий момент, он рисует 6 белых прямоугольников с красными контурами:

enter image description here

0 голосов
/ 08 января 2019

Попробуйте следующее:

from graphics import *

def main():
    win = GraphWin("Squares", 500, 500)

    # create all rects
    rects = [Rectangle(Point(0 + 20*i,500 - 20*i), Point(500 - 20*i, 0 + 20*i)) for i in range(12)]

    # draw all rects
    for idx, rect in enumerate(rects):
        rect.fill("red" if idx % 2 == 0 else "white")
        rect.draw(win)
...