Python - Tkinter - Paint: Как рисовать плавно и сохранять изображения под разными именами? - PullRequest
0 голосов
/ 03 сентября 2018

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

from tkinter import *
# by Canvas I can't save image, so i use PIL
import PIL
from PIL import Image, ImageDraw


def save():
    filename = 'image.png'
    image1.save(filename)

def paint(event):
    x1, y1 = (event.x), (event.y)
    x2, y2 = (event.x + 1), (event.y + 1)
    cv.create_oval((x1, y1, x2, y2), fill='black', width=10)
    #  --- PIL
    draw.line((x1, y1, x2, y2), fill='black', width=10)


root = Tk()

cv = Canvas(root, width=640, height=480, bg='white')
# --- PIL
image1 = PIL.Image.new('RGB', (640, 480), 'white')
draw = ImageDraw.Draw(image1)
# ---- 
cv.bind('<B1-Motion>', paint)
cv.pack(expand=YES, fill=BOTH)

btn_save = Button(text="save", command=save)
btn_save.pack()

root.mainloop()

I know, this is awful :(

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете использовать непрерывное рисование вместо рисования отдельных маленьких кружков.
В следующем примере хранятся последние значения положения мыши, чтобы нарисовать линию к текущему значению.

Вам нужно нажать и переместить мышь, чтобы нарисовать; отпустите кнопку, чтобы остановить.

Имя изображения содержит число, которое увеличивается на 1 при каждом сохранении; поэтому вы можете сохранить все промежуточные изображения при рисовании полной картинки.

from tkinter import *
import PIL
from PIL import Image, ImageDraw


def save():
    global image_number
    filename = f'image_{image_number}.png'   # image_number increments by 1 at every save
    image1.save(filename)
    image_number += 1


def activate_paint(e):
    global lastx, lasty
    cv.bind('<B1-Motion>', paint)
    lastx, lasty = e.x, e.y


def paint(e):
    global lastx, lasty
    x, y = e.x, e.y
    cv.create_line((lastx, lasty, x, y), width=1)
    #  --- PIL
    draw.line((lastx, lasty, x, y), fill='black', width=1)
    lastx, lasty = x, y


root = Tk()

lastx, lasty = None, None
image_number = 0

cv = Canvas(root, width=640, height=480, bg='white')
# --- PIL
image1 = PIL.Image.new('RGB', (640, 480), 'white')
draw = ImageDraw.Draw(image1)

cv.bind('<1>', activate_paint)
cv.pack(expand=YES, fill=BOTH)

btn_save = Button(text="save", command=save)
btn_save.pack()

root.mainloop()

Якобы не менее страшен, чем ваш, но линии непрерывны ...

enter image description here

...