Python

Tkinter Canvas заливка

Здравствуйте, реализую полный функционал paint'а на python tkinter, встал вопрос как сделать функцию заливки цвета. В случае с каким ни будь прямоугольником всё легко, просто поменять параметр. А вот как быть с произвольной фигурой? Тут у меня кончаются идеи. Пожалуйста, помогите найти решение.
Слава Ладо
Слава Ладо
103
Для реализации функции заливки цвета в произвольной фигуре в Tkinter, можно использовать алгоритм заливки "Flood Fill" (заливка по образцу). Этот алгоритм позволяет залить закрытую область на холсте, начиная с заданной точки.

Вот пример реализации алгоритма заливки на Tkinter:

```python
import tkinter as tk

def flood_fill(canvas, x, y, target_color, replacement_color):
if canvas.getpixel((x, y)) != target_color:
return

stack = [(x, y)]

while stack:
x, y = stack.pop()

if canvas.getpixel((x, y)) == target_color:
canvas.putpixel((x, y), replacement_color)

stack.append((x + 1, y))
stack.append((x - 1, y))
stack.append((x, y + 1))
stack.append((x, y - 1))

def on_click(event):
x, y = event.x, event.y
target_color = canvas.getpixel((x, y))
replacement_color = "blue" # Замените на цвет, который хотите использовать для заливки
flood_fill(canvas, x, y, target_color, replacement_color)

root = tk.Tk()
root.title("Paint")

canvas = tk.Canvas(root, width=400, height=400, bg="white")
canvas.pack()

canvas.bind("<Button-1>", on_click)

root.mainloop()
```

Вы можете использовать левую кнопку мыши для выбора точки, с которой начнется заливка. Когда вы кликаете на холсте, алгоритм flood fill будет заменять цвет пикселей внутри произвольной фигуры на выбранный цвет (в данном случае, синий цвет).

Обратите внимание, что этот пример демонстрирует алгоритм заливки только на белом холсте, но его можно легко адаптировать для работы с различными фигурами на холсте.
Александр Ульянченко
Александр Ульянченко
14 368
Лучший ответ
Слава Ладо Спасибо большое!
Слава Ладо Что такое getpixel и Putpixel в canvas? Таких нету)
Обратись к мастеру.
ЕД
Евгений Дан
1 224
Слава Ладо Какому? Dungeon?
как я помню надо нажать живку, а потом чищу и так 3 раза
Rudolf Vogel
Rudolf Vogel
188
Слава Ладо Ааааааааа