#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. Ошибка типа: ‘