从变量循环颜色用于graphics.py

1 投票
2 回答
3408 浏览
提问于 2025-04-17 06:42

我正在创建一个图形程序,这个程序可以根据用户指定的网格大小,画出100 x 100的方块,并把它们一个接一个地排列在一起。用户还可以输入4种颜色,用来给这些方块上色(比如,如果他们输入红色、绿色、蓝色和黄色,那么方块就会按照这个顺序上色,颜色会循环使用)。

我想知道,是否可以根据用户提供的颜色来循环使用这些颜色?

这是我目前的代码:

def main():
    print ("Please enter four comma seperated colours e.g.: 'red,green,blue,yellow'\n\
    Allowed colours are: red, green, blue, yellow and cyan")
    col1, col2, col3, col4 = input("Enter your four colours: ").split(',')
    win = GraphWin ("Squares", 500, 500)
    colours = [col1, col2, col3, col4]
    drawSquare (win, col1, col2, col3, col4, colours)
    win.getMouse()
    win.close()


def drawSquare(win, col1, col2, col3, col4, colours):
    for i in range (4):
        for j in range (len(colours)):
            colour = colours[j]
            x = 50 + (i * 50)
            circle = Circle (Point (x,50), 20)
            circle.setFill(colour)
            circle.draw(win)

我觉得我应该以某种方式使用一个列表,但我还不太清楚具体该怎么做。

2 个回答

0

我不知道你具体问的是什么,但你提到的变量col1到col4其实并没有用到。而且,用range(len(iterable))来循环其实没必要。下面是一个简化版。

def main():
    print ("Please enter four comma seperated colours e.g.: 'red,green,blue,yellow'\n\
    Allowed colours are: red, green, blue, yellow and cyan")
    colours = input("Enter your four colours: ").split(',')
    win = GraphWin ("Squares", 500, 500)
    drawSquare (win, colours)
    win.getMouse()
    win.close()


def drawSquare(win, colours):
    for i in range (4):
        for colour in colours:
            x = 50 + (i * 50)
            circle = Circle (Point (x,50), 20)
            circle.setFill(colour)
            circle.draw(win)

“用户给出的变量中的颜色可以循环吗?”

可以的,你已经在这么做了。

0

如果你想根据用户的变量选择4种颜色,可以使用取模运算。

color_index = user_var % 4

然后你可以这样获取颜色:

mycolor = colours[color_index]

另外,如果你想每次给用户不同的颜色,并且在用完所有可用颜色后再循环使用这些颜色,可以使用itertools.cycle这个工具:

In [21]: colours = ['r','b','y','c']
In [22]: from itertools import cycle
In [23]: color = cycle(colours)

In [25]: color.next()
Out[25]: 'r'

In [27]: color.next()
Out[27]: 'b'

In [28]: color.next()
Out[28]: 'y'

In [29]: color.next()
Out[29]: 'c'

In [30]: color.next()
Out[30]: 'r'

In [31]: color.next()
Out[31]: 'b'

这样你就可以得到:

在这里输入图片描述

还有代码:

from graphics import GraphWin, Rectangle, Point
from itertools import cycle

def main():
    print (("Please enter four comma seperated colours e.g.:"
             "'red,green,blue'\n" 
             "Allowed colours are: red, green, blue, yellow and cyan"))
    colours = input("Enter your four colours: ").split(',')
    print ("Please enter gridsize e.g.: '100'")
    gsize = int(input("Enter gridsize: "))
    win_size = 250
    win = GraphWin("Squares", win_size, win_size)
    drawSquares(win, gsize, win_size, colours)
    win.getMouse()
    win.close()

def drawSquares(win, gsize, winsize, colours):
    side = winsize / gsize
    color = cycle(colours)
    for row in range(gsize):
        y1 = row * side
        y2 = y1 + side
        for column in range(gsize):
            x1 = column * side
            x2 = x1 + side
            rect = Rectangle(Point(x1, y1), Point(x2, y2))
            rect.setFill(color.next())
            rect.draw(win)

main()

撰写回答