"怎么使用Python和Tkinter实现简单的画图软件"
一起画图吧
为什么突然想搞这个画图软件呢
不瞒各位,是因为最近接到了一个很小很小很小小得不能再小的小项目
就是基于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 >= 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>