Обновить холст после удаления - Tkinter - PullRequest
0 голосов
/ 19 ноября 2018

Моя проблема в том, что, когда я обращаюсь к изображению из D:/Folder/my_drawing.jpg после «очистки» холста, холст загрязняется предыдущими нарисованными изображениями. Холст визуально чистый, но накапливает прежнее нарисованное изображение и новое. Цель - создать программу, подобную Paint, которая позволяет сохранять рисунки и с помощью кнопки очищать весь холст.

Поведение выглядит следующим образом: Сначала я рисую изогнутую линию, после очистки холста, и после этого я рисую линию, и когда я обращаюсь к изображению, открывая файл, изображение составляется, как показано ниже:

Это код в Python:

import os
from tkinter import *
from PIL import Image, ImageDraw
class Paint(object):

    def __init__(self):
            self.root = Tk()        
            self.pen_button = self.use_pen

            self.save_button = Button(self.root, text='Save', command=self.Save)        
            self.save_button.grid(row=0, column=3)


            self.eraser_button = Button(self.root, text='Clean canvas', command=self.use_eraser)
            self.eraser_button.grid(row=0, column=1)

            self.c = Canvas(self.root, bg='white', width=600, height=600)        
            self.c.grid(row=1, columnspan=5) 

            self.setup()
            self.root.mainloop()

    def activate_button(self, some_button):        
            self.active_button = some_button
    def use_pen(self):
        self.activate_button(self.pen_button)


    def setup(self):
        self.path=''
        self.old_x = None
        self.old_y = None
        self.image1 = Image.new("RGB",(600,600),'white')
        self.draw = ImageDraw.Draw(self.image1)
        self.active_button = self.pen_button

        self.c.bind('<B1-Motion>', self.paint)
        self.c.bind('<ButtonRelease-1>', self.reset)     

    def use_eraser(self):       
            self.c.delete(ALL)   

    def Save(self):
            self.c.postscript(file="my_drawing.jpg", colormode='color')
            filename = "my_drawing.jpg"
            self.image1.save(filename)            

    def paint(self, event):        
        self.line_width = 2.0    
        paint_color = 'black'
        if self.old_x and self.old_y:
            self.c.create_line(self.old_x, self.old_y, event.x, event.y,
                               width=self.line_width, fill=paint_color, dash=(),capstyle=ROUND, smooth=TRUE, splinesteps=36)
            self.draw.line([self.old_x, self.old_y, event.x, event.y], fill="black", width=5)

        self.old_x = event.x
        self.old_y = event.y

    def reset(self, event):
        self.old_x, self.old_y = None, None


if __name__ == '__main__':
    Paint()

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я решил это с этими изменениями. Я надеюсь, что это служит другому с той же проблемой.

import io
    def Save(self):        
        ps=self.c.postscript(colormode='color')
        img = Image.open(io.BytesIO(ps.encode('utf-8')))
        img.save('D:/Folder/my_drawing.jpg')

def paint(self, event):        
        self.line_width = 2.0    
        paint_color = self.color
        if self.old_x and self.old_y:
            self.c.create_line(self.old_x, self.old_y, event.x, event.y,
                               width=self.line_width, fill=paint_color, dash=(),
                               capstyle=ROUND, smooth=TRUE, splinesteps=36)        
        self.old_x = event.x
        self.old_y = event.y
0 голосов
/ 20 ноября 2018

Да, хорошо ... вы никогда не отображаете изображение на холсте.

В функции paint() сначала вы рисуете сегмент сегмент на холсте, а затем рисуете его на изображении.

Функция use_eraser() очищает холст, но ничего не делает с изображением self.image1.

Итак, не рисуйте ничего на холсте, а только на изображении, а затем отображайте изображение на холсте. Я не очень много работал с PIL, но я думаю, что изображение будет обновляться автоматически, когда вы рисуете на нем.

...