уточнение линий и выпрямлений выводит ошибку изображения Мондриана

#python #list #tuples #typeerror

Вопрос:

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

Я использую модуль mondrianish 0.5.3. https://pypi.org/project/mondrianish/

Я ввожу:

 from mondrianish import generate_image, generate_grid 

colors = ("#FFF8F0", "#FCAA67", "#7DB7C0", "#932b25", "#498B57")

lines, rects = generate_grid((20, 10), density=0.3)

with open("output-1.png", "wb") as f:
    generate_image("png", (lines, rects), 10, colors, f)
 
 

Выходит ошибка:

 TypeError: unsupported operand type(s) for /: 'list' and 'int'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
c:/Users/Peter Chung/Desktop/MyScript/Python/MondrianScript.py in <module>
      6 
      7 with open("output-1.png", "wb") as f:
----> 8         generate_image("png", (lines, rects), 10, colors, f)
      9 

~/anaconda3/envs/finviz/lib/python3.8/site-packages/mondrianish/__init__.py in generate_image(format, size, stroke_width, colors, stream)
    266 
    267   # Generate image data.
--> 268   grid_size = (int(round(size[0]/stroke_width/7)), int(round(size[1]/stroke_width/7)))
    269   if grid_size[0] < 3 or grid_size[1] < 3: raise ValueError("Stroke width is too large.")
    270   lines, rectangles = generate_grid(grid_size)

TypeError: unsupported operand type(s) for /: 'list' and 'int'

 

Я попытался изменить тип списков и прямоугольников, но все они имеют одинаковую ошибку. Пожалуйста, посоветуйтесь. Спасибо!

Комментарии:

1. lines и rects составляют списки. Вы можете передать их generate_image как width «и height «. Вам нужно передавать номера, например (200, 100) , а не пару списков.

2. @TomKarzes хорошо, теперь я это знаю, но что, если я захочу изменить строки и строки, а затем вернуть их в код и создать изображение ?

Ответ №1:

Правильный ответ содержится в комментарии @Tom Karzes, функция generate_image ожидает повторения с 2 числами для size параметра.

Заглянув в код Мондриана, в частности в строку 268, вы можете увидеть, что он пытается проиндексировать параметр размера и ожидает появления номера.

Если вы хотите, вы можете изменить функцию generate_image() и включить ее в созданную пользователем сетку.

Есть много способов сделать это, но я думаю, что замена строк с 268 по 270 __init__.py приведенным ниже кодом должна сработать:

 try:      
    grid_size = (int(round(size[0]/stroke_width/7)), int(round(size[1]/stroke_width/7)))
    if grid_size[0] < 3 or grid_size[1] < 3: raise ValueError("Stroke width is too large.")
    lines, rectangles = generate_grid(grid_size)
except TypeError:
    lines, rectangles = size
 

Это всего лишь быстрое решение, но на данный момент оно решит вашу проблему.

Комментарии:

1. спасибо, но я хочу увеличить линии и прямоугольники и сохранить размер, я думаю, что не знаю, как ввести целое число «изменение линий и прямоугольников» в функцию generate_image.

2. Для этого вам нужно взять lines и rect и изменить координаты, а затем передать их обратно в generate_image функцию, измененную, как я предлагал выше. lines и rect являются просто набором координат

3. Ошибка типа: ‘