PHP前端开发

"怎么使用Python和Tkinter实现简单的画图软件"

百变鹏仔 1个月前 (01-21) #Python
文章标签 画图

一起画图吧

为什么突然想搞这个画图软件呢

不瞒各位,是因为最近接到了一个很小很小很小小得不能再小的小项目

就是基于Tkinter,做一个简易的画图软件,要求不高,能画就行,能保存就行,能撤回就行,能导入就行!

于是,遇到项目就精神抖擞的俺,三下五除二的就夸夸夸的写,终于!花了将近两个小时多的时间,写出来了一个还用得过去得画图软件,虽然这个画图软件是写出来了,但是,俺意犹未尽呀(贪婪!太贪婪了!),于是想搞一个更加NB一点的画图软件,于是我打开浏览器(哦不),打开俺滴大脑,想着提升一下画图软件的功能,于是就写了以下画图软件

画图软件

基本介绍:构造一个GUI图形界面,主菜单有导入图片、保存截图、清屏、撤销、工具栏等功能,工具栏中有铅笔画图、画直线、画矩形、画圆形、添加文本、橡皮擦、颜色填充、设置前景色和设置背景色等功能。

立即学习“Python免费学习笔记(深入)”;

用到的模块:Tkinter、PIL

画不多说,展示一波

话不多说,介绍一波

导入。可导入后缀名为jpg、png、gif的图片,可在软件上呈现图片,可进行绘画。

保存。任意截取屏幕上的部分,截取好后按下回车键,即可保存,若想退出,则按下esc键

清屏。顾名思义,咱就不多说了

撤销。即返回上一步,但是里面有一个小bug,具体是啥,各位猜猜

工具栏。工具栏里有啥呢?进来看看就知道咯

实现代码

import tkinter as tkfrom tkinter import *import tkinter.simpledialogimport tkinter.colorchooserimport tkinter.filedialogfrom PIL import Image, ImageTk, ImageGrabfrom tkinter.colorchooser import askcolorfrom win32 import win32api, win32gui, win32printfrom win32.lib import win32confrom win32.win32api import GetSystemMetricsclass Draw_designs(tk.Frame):    def __init__(self, master=None):        tk.Frame.__init__(self, master)        self.master = master        self.pack()        self.temp = []  # 保存图形的类型        self.li = []    # 保存所画图形的坐标        self.fill_color = None # 保存填充的颜色        self.lastDraw = 0        self.end = [0]        self.size = "12"    # 字体大小        self.yesno = 0        self.function = 1   # 默认铅笔        self.X = 0        self.Y = 0        self.foreColor = '#000000'        self.backColor = '#FFFFFF'        self.create_widget()        self.setMenu()    def create_widget(self):        self.image = PhotoImage()        self.canvas = Canvas(root, bg='white', width=x, height=y)   # 创建画布        self.canvas.create_image(x, y, image=self.image)        self.canvas.bind('<button-1>', self.onLeftButtonDown)        self.canvas.bind('<b1-motion>', self.onLeftButtonMove)        self.canvas.bind('<buttonrelease-1>', self.onLeftButtonUp)        self.canvas.bind('<buttonrelease-3>', self.onRightButtonUp)        self.canvas.pack(fill=tk.BOTH, expand=tk.YES)    def setMenu(self):        '''主菜单及其关联的函数'''        self.menu = tk.Menu(self, bg="red")        root.config(menu=self.menu)        self.menu.add_command(label='导入', command=self.Import)        self.menu.add_command(label='保存', command=self.SavePicture)        self.menu.add_command(label='清屏', command=self.Clear)        self.menu.add_command(label='撤销', command=self.Back)        '''子菜单及其关联的函数'''        self.menuType = tk.Menu(self.menu, tearoff=0)   # tearoff=0 - 表示无法将下拉菜单从“工具栏”窗口分离        self.menu.add_cascade(label='工具栏', menu=self.menuType)  # add_cascade建立菜单类别对象        # 在"工具栏"内建立菜单列表        self.menuType.add_command(label='铅笔', command=self.drawCurve)        self.menuType.add_command(label='直线', command=self.drawLine)        self.menuType.add_command(label='矩形', command=self.drawRectangle)        self.menuType.add_command(label='圆形', command=self.drawCircle)        self.menuType.add_command(label='文本', command=self.drawText)        self.menuType.add_command(label='橡皮擦', command=self.onErase)        self.menuType.add_command(label='颜色填充', command=self.fill)        self.menuType.add_separator()       # 建立分隔线        self.menuType.add_command(label='选择前景色', command=self.chooseForeColor)        self.menuType.add_command(label='选择背景色', command=self.chooseBackColor)    def Import(self):     # 导入文件        filename = tk.filedialog.askopenfilename(title='导入图片', filetypes=[('image', '*.jpg *.png *.gif')])        if filename:            self.image = Image.open(filename)            self.image = self.image.resize((800, 600), Image.ANTIALIAS)            self.image = ImageTk.PhotoImage(self.image)            self.canvas.create_image(400, 300, image=self.image)    def SavePicture(self):      # 保存画布        ScreenShot()    def Clear(self):    # 清屏        for item in self.canvas.find_all():            self.canvas.delete(item)        # 清屏后对数据进行初始化        self.end = [0]        self.lastDraw = 0    def Back(self):     # 撤回        try:            for i in range(self.end[-2], self.end[-1] + 1):                self.canvas.delete(i)            self.end.pop()            self.li.pop()        except:            self.end = [0]    def onLeftButtonDown(self, event):  # 点击鼠标左键后运行此函数        self.yesno = 1        self.X = event.x        self.Y = event.y        if self.function == 7:  # 颜色填充            for i in range(len(self.li)):                if (self.X &gt;= self.li[i][0] and self.X = self.li[i][1] and self.Y ', self.exit)        self.win.bind('<keypress-return>', self.confirmScreenShot)        self.win.bind('<button-1>', self.selectStart)        self.win.bind('<buttonrelease-1>', self.selectDone)        self.win.bind('<motion>', self.changeSelectionArea)        self.canvas = tk.Canvas(self.win, width=self.width,                                height=self.height)        self.canvas.pack()        self.area = SelectionArea(self.canvas)        self.win.mainloop()    def exit(self, event):        self.win.destroy()    def clear(self):        self.canvas.delete('area', 'lt_txt', 'rb_txt')        self.win.attributes('-alpha', 0)    def captureImage(self):        if self.area.empty():            return None        else:            filename = tk.filedialog.asksaveasfilename(filetypes=[('.jpg', 'JPG')],                                                       initialdir='C:\Users\lin042\Desktop\')            box_area = [x * screen_scale_rate for x in self.area.area_box.box()]            self.clear()            img = ImageGrab.grab(box_area).save(filename)            return img    def confirmScreenShot(self, event):        img = self.captureImage()        if img is not None:            img.show()        self.win.destroy()    def selectStart(self, event):        self.is_selecting = True        self.area.setStartPoint(event.x, event.y)        # print('Select', event)    def changeSelectionArea(self, event):        if self.is_selecting:            self.area.updateEndPoint(event.x, event.y)            # print(event)    def selectDone(self, event):        self.is_selecting = Falseif __name__ == '__main__':    x = 1200    # 宽    y = 600     # 高    root = tk.Tk()    root.title('街三仔画图')   # 软件名    root.geometry('1200x600')    # 设置软件大小 - 宽x高    Draw_designs(root)    root.mainloop()</motion></buttonrelease-1></button-1></keypress-return></buttonrelease-3></buttonrelease-1></b1-motion></button-1>