Я делаю Рождественский фонарь с Zelle graphics.py и хочу, чтобы средние круги мигали разноцветными огнями - PullRequest
0 голосов
/ 20 января 2020

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

Код:

from graphics import *
import random, time

def lantern():
    win = GraphWin('Lantern', 800, 800)

    #3 Large Circles
    c = [[400,300], [400,300], [400,300]]

    largeCircle = [250, 180, 100]

    for i in range (len(largeCircle)):
        c[i] = Circle(Point(c[i][0] ,c[i][1]), largeCircle[i])

    #10 Medium Circles
    mc = [[465,95], [560,155], [610,250], [610,360], [550,455], [245,447], [193,350], [193,250], [245,150], [350,92]]


    for i in range (len(mc)):
        mc[i] = Circle(Point(mc[i][0], mc[i][1]), 25)

    #11 Small Circles
    sc = [[450,160], [520,200], [550,265], [545,344], [508,410], [400,450], [290,405], [250,339], [250,265], [285,195], [355,155]]

    for i in range (len(sc)):
        sc[i] = Circle(Point(sc[i][0], sc[i][1]), 15)

    #5 XtraSmall Circles
    xsc = [[453,237], [474,325], [400,365], [325,325], [350,237]]

    for i in range (len(xsc)):
        xsc[i] = Circle(Point(xsc[i][0], xsc[i][1]), 8)

    #16 Lines
    l1 = [[532,90], [540,93], [620,180], [622,185], [613,430], [609,435], [520,520], [515,520], [310,457], [305,454], [240,380], [235,378], [178,187], [180,182], [265,90], [270,88]]
    l2 = [[500,150], [505,156], [555,210], [558,215], [555,390], [550,396], [490,454], [485,456], [275,519], [270,516], [180,420], [178,415], [242,216], [244,212], [300,150], [304,150]]
    n = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    for i in range (len(n)):
        n[i] = Line(Point(l1[i][0], l1[i][1]), Point(l2[i][0],l2[i][1]))


    #Star
    p1 = Polygon(Point(400,200), Point(440,260), Point(498,280), Point(450,320), Point(470,370), Point(400,345), Point(327,369), Point(345,320), Point(303,280), Point(360,260))

    #Red Box
    p2 = Polygon(Point(400,480), Point(480,560), Point(400,650), Point(325,560))

    #Triangle
    p3 = Polygon(Point(400,120), Point(437,207), Point(503,153), Point(478,238), Point(556,213), Point(500,280), Point(580,305), Point(495,330), Point(555,395), Point(470,373), Point(488,455), Point(400,400), Point(307,454), Point(328,370), Point(235,378), Point(305,330), Point(220,303), Point(303,280), Point(242,215),Point(330,230), Point(300,150), Point(370,205)) 

    r1 = Rectangle(Point(650,300),Point(580,305))
    r2 = Rectangle(Point(397,50),Point(404,120))
    r3 = Rectangle(Point(220,300),Point(150,305))


    for i in range(3):
        c[i].draw(win)
        c[i].setWidth(3)

    c[0].setFill('lavender')
    c[1].setFill('orange')
    c[2].setFill('red')

    for i in range(10):
        r = random.randrange(256)
        b = random.randrange(256)
        g = random.randrange(256)
        colors = color_rgb(r, g, b)
        mc[i].draw(win)
        mc[i].setWidth(3)
        mc[i].setFill(colors)

    for i in range(11):
        sc[i].draw(win)
        sc[i].setWidth(3)

    for i in range(5):
        xsc[i].draw(win)
        xsc[i].setWidth(3)

    for i in range(16):
        n[i].draw(win)
        n[i].setFill('brown')
        n[i].setWidth(3)


    p1.draw(win)
    p1.setWidth(3)
    p1.setFill('yellow')

    p2.draw(win)
    p2.setFill("red")
    p2.setWidth(3)

    p3.draw(win)
    p3.setWidth(3)
    p3.setOutline('purple')

    r1.draw(win)
    r1.setOutline('brown')
    r1.setWidth(3)

    r2.draw(win)
    r2.setOutline('brown')
    r2.setWidth(3)

    r3.draw(win)
    r3.setOutline('brown')
    r3.setWidth(3)

    message = Text(Point(400,560), '福')
    message.setSize(30)
    message.setFill('gold')
    message.draw(win)

    win.getMouse()
    win.close()

lantern()

1 Ответ

0 голосов
/ 20 января 2020

Вот способ сделать это. Он частично основан на информации, содержащейся в разделе Управление обновлениями дисплея (Advanced) онлайн-модуля Zelle graphics Документация .

Изменения, внесенные в ваш код: обозначено # ALL CAPS комментариями. Конструкция GraphWin и его закрытие были удалены из функции lantern(), а также добавлено al oop для периодического обновления кругов, представляющих источники света.

Поскольку перерисовка источников света будет сделано много раз, была добавлена ​​функция с именем draw_mcs(), и она часто вызывается в al oop, чтобы генерировать последовательные «кадры» анимации, заставляя светиться, чтобы они выглядели мигающими, изредка рисуя их черным цветом. Вы можете управлять скоростью с помощью целочисленного аргумента, передаваемого в функцию update() в конце l oop, то есть количества раз в секунду для их перерисовки.

Для обмена данными между * Функции 1017 * и draw_mcs(), пара списков были объявлены global. Один из них является новым и сохраняет цвет каждого источника света, поэтому он будет мигать тем же цветом, с которого начинал.

from graphics_5p0 import *
import random, time

BLACK = color_rgb(0,0,0)
RATE = 5


def lantern(win):
    global colors  # ADDED
    global mc      # ADDED

#    win = GraphWin('Lantern', 800, 800)  # MOVED.

    #3 Large Circles
    c = [[400,300], [400,300], [400,300]]

    largeCircle = [250, 180, 100]

    for i in range (len(largeCircle)):
        c[i] = Circle(Point(c[i][0] ,c[i][1]), largeCircle[i])

    #10 Medium Circles
    mc = [[465,95], [560,155], [610,250], [610,360], [550,455], [245,447], [193,350], [193,250], [245,150], [350,92]]


    for i in range (len(mc)):
        mc[i] = Circle(Point(mc[i][0], mc[i][1]), 25)

    #11 Small Circles
    sc = [[450,160], [520,200], [550,265], [545,344], [508,410], [400,450], [290,405], [250,339], [250,265], [285,195], [355,155]]

    for i in range (len(sc)):
        sc[i] = Circle(Point(sc[i][0], sc[i][1]), 15)

    #5 XtraSmall Circles
    xsc = [[453,237], [474,325], [400,365], [325,325], [350,237]]

    for i in range (len(xsc)):
        xsc[i] = Circle(Point(xsc[i][0], xsc[i][1]), 8)

    #16 Lines
    l1 = [[532,90], [540,93], [620,180], [622,185], [613,430], [609,435], [520,520], [515,520], [310,457], [305,454], [240,380], [235,378], [178,187], [180,182], [265,90], [270,88]]
    l2 = [[500,150], [505,156], [555,210], [558,215], [555,390], [550,396], [490,454], [485,456], [275,519], [270,516], [180,420], [178,415], [242,216], [244,212], [300,150], [304,150]]
    n = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    for i in range (len(n)):
        n[i] = Line(Point(l1[i][0], l1[i][1]), Point(l2[i][0],l2[i][1]))

    #Star
    p1 = Polygon(Point(400,200), Point(440,260), Point(498,280), Point(450,320), Point(470,370), Point(400,345), Point(327,369), Point(345,320), Point(303,280), Point(360,260))

    #Red Box
    p2 = Polygon(Point(400,480), Point(480,560), Point(400,650), Point(325,560))

    #Triangle
    p3 = Polygon(Point(400,120), Point(437,207), Point(503,153), Point(478,238), Point(556,213), Point(500,280), Point(580,305), Point(495,330), Point(555,395), Point(470,373), Point(488,455), Point(400,400), Point(307,454), Point(328,370), Point(235,378), Point(305,330), Point(220,303), Point(303,280), Point(242,215),Point(330,230), Point(300,150), Point(370,205))

    r1 = Rectangle(Point(650,300),Point(580,305))
    r2 = Rectangle(Point(397,50),Point(404,120))
    r3 = Rectangle(Point(220,300),Point(150,305))

    for i in range(3):
        c[i].draw(win)
        c[i].setWidth(3)

    c[0].setFill('lavender')
    c[1].setFill('orange')
    c[2].setFill('red')

    colors = []  # ADDED
    for i in range(10):
        r = random.randrange(256)
        b = random.randrange(256)
        g = random.randrange(256)
        color = color_rgb(r, g, b)         # ADDED
        colors.append(color)               # ADDED
        mc[i].draw(win)
        mc[i].setWidth(3)
        mc[i].setFill(color)  # CHANGED


    for i in range(11):
        sc[i].draw(win)
        sc[i].setWidth(3)

    for i in range(5):
        xsc[i].draw(win)
        xsc[i].setWidth(3)

    for i in range(16):
        n[i].draw(win)
        n[i].setFill('brown')
        n[i].setWidth(3)


    p1.draw(win)
    p1.setWidth(3)
    p1.setFill('yellow')

    p2.draw(win)
    p2.setFill("red")
    p2.setWidth(3)

    p3.draw(win)
    p3.setWidth(3)
    p3.setOutline('purple')

    r1.draw(win)
    r1.setOutline('brown')
    r1.setWidth(3)

    r2.draw(win)
    r2.setOutline('brown')
    r2.setWidth(3)

    r3.draw(win)
    r3.setOutline('brown')
    r3.setWidth(3)

    message = Text(Point(400,560), '福')
    message.setSize(30)
    message.setFill('gold')
    message.draw(win)

#    win.getMouse()  # MOVED.
#    win.close()     # MOVED.

# ADDED.
def draw_mcs(win):
    """ Redraw the mc circles and change their color to black once in a while. """
    global colors  # ADDED
    global mc      # ADDED

    for i in range(10):
        mc[i].undraw()
        mc[i].draw(win)
        mc[i].setWidth(3)
        color = colors[i] if random.randint(0, RATE) else BLACK
        mc[i].setFill(color)  # CHANGED

# MAIN LOOP.
win = GraphWin('Lantern', 800, 800, autoflush=False)
lantern(win)
for _ in range(100):
    draw_mcs(win)
    update(10)

win.getMouse()
win.close()

...