【问题标题】:Refresh canvas after deleting - Tkinter删除后刷新画布 - Tkinter
【发布时间】:2018-11-19 05:08:41
【问题描述】:

我的问题是,当我在“清理”画布后查阅来自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()

【问题讨论】:

  • 您的代码没有运行。请提供Minimal, Complete, and Verifiable example。还请提供程序使用的任何数据或图像的示例。
  • 抱歉,现在我添加了待处理的代码部分。谢谢。

标签: python canvas tkinter python-imaging-library


【解决方案1】:

是的,嗯...,你从来没有真正在画布上显示图像。

在函数paint() 中,您首先在画布上绘制线段,然后在图像中绘制它。

函数use_eraser() 清除画布,但不处理图像self.image1

所以,不要在画布上绘制任何东西,而只在图像上绘制,然后在画布上显示图像。我对PIL 的工作不多,但我认为图像显示会在您绘制时自动更新。

【讨论】:

    【解决方案2】:

    我已经通过这些更改解决了这个问题。我希望它对另一个有同样问题的人有用。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多