首页 公开文件分享 音乐分享 游戏分享 工具分享 其它文件分享 文章 随笔 聊天大厅 小工具 小游戏 关于我们 登录 注册


GC动画制作工具

作者:hhcgchpspk                发布时间:2026-08-18

突发奇想用半天做的一个小工具,试了试还行,就是有点卡

from tkinter import Tk import tkinter.messagebox from tkinter import * from tkinter import filedialog from PIL import Image,ImageDraw import imageio import numpy as np import time def main(): def start(): def checkOk(): value=choice.get() if value==1: width=150 height=100 elif value==2: width=200 height=200 elif value==3: width=300 height=240 elif value==4: width=400 height=360 else: tkinter.messagebox.showerror('error','未选择绘画板大小') return ##获取大小值 root.destroy()#销毁初始窗口 paint(width,height)#打开绘画窗口 ##选择完毕 root=Tk() root.title('GC动画制作工具') root.geometry('300x300') try: root.iconbitmap('icon.ico')#设置图标 except Exception: pass sizeLabel=Label(root,text='请选择绘画板大小',font=('微软雅黑',15)) choice=tkinter.IntVar() ##要绑定的布尔类型 check1=Radiobutton(root,text='150x100',font=('微软雅黑',13),variable=choice,value=1) check2=Radiobutton(root,text='250x200',font=('微软雅黑',13),variable=choice,value=2) check3=Radiobutton(root,text='300x300',font=('微软雅黑',13),variable=choice,value=3) check4=Radiobutton(root,text='500x400',font=('微软雅黑',13),variable=choice,value=4) choice.set(2)#默认勾选 ##大小选择 ok=Button(root,text='开始绘图',font=('微软雅黑',16),command=checkOk) sizeLabel.pack() check1.pack() check2.pack() check3.pack() check4.pack() ok.pack() root.mainloop() ##开始界面 def paint(width,height): root=Tk() root.title('GC动画制作工具') root.geometry('%dx%d'%(int(width+300),int(height+200))) root.resizable(False,False)#锁定窗口 try: root.iconbitmap('icon.ico')#设置图标 except Exception: pass allPage=0#总页面数 nowPage=0#当前页面 color='black'#默认画笔颜色 bgColor='white'#默认背景颜色 canvas=None#当前画布 pixels=[]#当前页面的像素列表 pages=[]#存储所有页面数据 pixelSize=5#像素大小 def updatePageLabel(): pageLabel.config(text='%d/%d页'%(nowPage+1,allPage)) ##更新页数显示 def saveCurrentPage(): if canvas and pixels: colors=[] for pixel in pixels: colors.append(canvas.itemcget(pixel,'fill')) return {'colors':colors,'bgColor':bgColor} return None ##保存当前页面数据 def loadPage(pageData): nonlocal pixels,bgColor if not pageData: return colors=pageData['colors'] bgColor=pageData['bgColor'] #清空并重新绘制所有像素 pixels=[] canvas.delete('all')#清空画布 for i in range(width * height): row=i//width col=i%width x1=col*pixelSize y1=row*pixelSize x2=x1+pixelSize y2=y1+pixelSize pixel = canvas.create_rectangle(x1, y1, x2, y2, fill=colors[i] if i < len(colors) else bgColor, outline='') pixels.append(pixel) ##加载数据到当前画布 def painted(canvas,pixels,idx): canvas.itemconfig(pixels[idx],fill=color)#切换颜色 def toLast(): nonlocal nowPage if nowPage>0: pages[nowPage]=saveCurrentPage()#保存当前页 nowPage=nowPage-1 loadPage(pages[nowPage])#切换到上一页 updatePageLabel() ##去上一页 def toNext(): nonlocal nowPage if nowPage255: red=255 if green<0: green=0 if green>255: green=255 if blue<0: blue=0 if blue>255: blue=255 displayColor=RGB(red,green,blue)#更新展示颜色 colorLabel.configure(background=displayColor)#刷新显示展示颜色 def finishColor(): nonlocal color red=int(redEntry.get()) green=int(greenEntry.get()) blue=int(blueEntry.get()) if red<0: red=0 if red>255: red=255 if green<0: green=0 if green>255: green=255 if blue<0: blue=0 if blue>255: blue=255 color=RGB(red,green,blue)#更新画笔颜色 paintColor.configure(background=color)#更新主窗口画笔颜色 colorWindow.destroy()#销毁子窗口 colorWindow=Toplevel() colorWindow.title('画笔颜色') colorWindow.geometry('300x300') displayColor=color colorLabel=Label(colorWindow,bd=0,background=displayColor)#画笔颜色展示 redLabel=Label(colorWindow,text='R',font=('微软雅黑',12)) redEntry=Spinbox(colorWindow,from_=0,to=255,font=('微软雅黑',12)) greenLabel=Label(colorWindow,text='G',font=('微软雅黑',12)) greenEntry=Spinbox(colorWindow,from_=0,to=255,font=('微软雅黑',12)) blueLabel=Label(colorWindow,text='B',font=('微软雅黑',12)) blueEntry=Spinbox(colorWindow,from_=0,to=255,font=('微软雅黑',12)) ##RGB颜色调整 refreshButton=Button(colorWindow,text='刷新',font=('微软雅黑',15),command=updateColorDisplay)#刷新显示按钮 finishButton=Button(colorWindow,text='完成',font=('微软雅黑',15),command=finishColor)#完成按钮 colorLabel.place(x=20,y=100,width=30,height=30) redLabel.place(x=100,y=20) redEntry.place(x=100,y=50,width=50,height=30) greenLabel.place(x=100,y=80) greenEntry.place(x=100,y=110,width=50,height=30) blueLabel.place(x=100,y=140) blueEntry.place(x=100,y=170,width=50,height=30) refreshButton.place(x=200,y=60) finishButton.place(x=200,y=150) ##改变画笔颜色 def changeBgColor(): nonlocal bgColor def updateBgDisplay(): red=int(redEntry.get()) green=int(greenEntry.get()) blue=int(blueEntry.get()) if red<0: red=0 if red>255: red=255 if green<0: green=0 if green>255: green=255 if blue<0: blue=0 if blue>255: blue=255 displayColor=RGB(red,green,blue)#更新展示颜色 bgLabel.configure(background=displayColor)#刷新显示展示颜色 def finishBgColor(): nonlocal bgColor red=int(redEntry.get()) green=int(greenEntry.get()) blue=int(blueEntry.get()) if red<0: red=0 if red>255: red=255 if green<0: green=0 if green>255: green=255 if blue<0: blue=0 if blue>255: blue=255 bgColor=RGB(red,green,blue)#更新背景颜色 backgroundColor.configure(background=bgColor)#更新主窗口背景颜色 for pixel in pixels: canvas.itemconfig(pixel,fill=bgColor)#更新当前画布背景色像素 bgWindow.destroy()#销毁子窗口 bgWindow=Toplevel() bgWindow.title('背景颜色') bgWindow.geometry('300x300') displayColor=bgColor bgLabel=Label(bgWindow,bd=0,background=displayColor)#背景颜色展示 redLabel=Label(bgWindow,text='R',font=('微软雅黑',12)) redEntry=Spinbox(bgWindow,from_=0,to=255,font=('微软雅黑',12)) greenLabel=Label(bgWindow,text='G',font=('微软雅黑',12)) greenEntry=Spinbox(bgWindow,from_=0,to=255,font=('微软雅黑',12)) blueLabel=Label(bgWindow,text='B',font=('微软雅黑',12)) blueEntry=Spinbox(bgWindow,from_=0,to=255,font=('微软雅黑',12)) ##RGB颜色调整 refreshButton=Button(bgWindow,text='刷新',font=('微软雅黑',15),command=updateBgDisplay)#刷新显示按钮 finishButton=Button(bgWindow,text='完成',font=('微软雅黑',15),command=finishBgColor)#完成按钮 tip=Label(bgWindow,text='小提示:更换背景色会\n覆盖当前画页内容',font=('微软雅黑',8)) bgLabel.place(x=20,y=100,width=30,height=30) redLabel.place(x=100,y=20) redEntry.place(x=100,y=50,width=40,height=30) greenLabel.place(x=100,y=80) greenEntry.place(x=100,y=110,width=40,height=30) blueLabel.place(x=100,y=140) blueEntry.place(x=100,y=170,width=40,height=30) refreshButton.place(x=200,y=60) finishButton.place(x=200,y=150) tip.place(x=180,y=210) ##改变背景颜色 def createNewPage(): nonlocal nowPage,allPage,canvas,pixels,bgColor def getPixelIndex(event): x=event.x//pixelSize y=event.y//pixelSize if 0<=x0: pages[nowPage]=saveCurrentPage()#如果当前页不是第一页,保存当前页 canvas=Canvas(root,width=width,height=height)#创建画布 canvas.place(x=20,y=50) canvas.bind('',startDraw)#绑定鼠标左键 canvas.bind('',draw)#绑定左键移动 pixels=[] colors=[] for i in range(width*height):#循环次数由图片大小决定 row=i//width col=i%width x1=col*pixelSize y1=row*pixelSize x2=x1+pixelSize y2=y1+pixelSize ##坐标 pixel=canvas.create_rectangle(x1,y1,x2,y2,fill=bgColor,outline='')#创建像素点 pixels.append(pixel) colors.append(bgColor) allPage+=1 nowPage=allPage-1 pages.append({'colors': colors, 'bgColor': bgColor}) updatePageLabel() ##创建新一页 def deletePage(): nonlocal allPage, nowPage if allPage <= 1: return # 至少保留一页 # 删除当前页 del pages[nowPage] allPage-=1 if nowPage>=allPage: nowPage=allPage-1 # 加载新页面 loadPage(pages[nowPage]) updatePageLabel() def saveVideo(filename,fps=10): if not pages: tkinter.messagebox.showinfo('error','你还没有画画') return frames=[] for page in pages: img=Image.new('RGB',(width*pixelSize,height*pixelSize),page['bgColor']) draw=ImageDraw.Draw(img) colors=page['colors'] for i,col in enumerate(colors): row=i//width colIdx=i%width x1=colIdx*pixelSize y1=row*pixelSize draw.rectangle([x1,y1,x1+pixelSize,y1+pixelSize],fill=col) frames.append(np.array(img)) with imageio.get_writer(filename, fps=fps) as writer: for frame in frames: writer.append_data(frame) ##保存为视频 num=int(time.time())#反覆盖文件名基数 def saveAvi(): nonlocal num saveVideo('%d.avi'%(num),fps=10) num=num+1 tkinter.messagebox.showinfo('success','保存成功') ##保存为avi文件 def saveMp4(): nonlocal num saveVideo('%d.mp4'%(num),fps=10) num=num+1 tkinter.messagebox.showinfo('success','保存成功') ##保存为mp4文件 def toSaveAvi(): nonlocal num filename=tkinter.filedialog.asksaveasfilename(defaultextension='.avi',title='另存为')#另存为文件对话框 if filename: saveVideo(filename,fps=10) num=num+1 tkinter.messagebox.showinfo('success','保存成功') ##另存为avi文件 def toSaveMp4(): nonlocal num filename=tkinter.filedialog.asksaveasfilename(defaultextension='.mp4',title='另存为')#另存为文件对话框 if filename: saveVideo(filename,fps=10) num=num+1 tkinter.messagebox.showinfo('success','保存成功') ##另存为mp4文件 def about(): tkinter.messagebox.showinfo('关于','作者:hhcgchpspk') ##关于 lastPage=Button(root,text='◀',bd=0,font=('微软雅黑',10),command=toLast)#上一页 nextPage=Button(root,text='▶',bd=0,font=('微软雅黑',10),command=toNext)#下一页 pageLabel=Label(root,text='%d/%d页'%(nowPage+1,allPage))#页数显示 paintColorLabel=Label(root,text='画笔颜色',font=('微软雅黑',10)) paintColor=Button(root,background=color,bd=0,command=changeColor)#画笔颜色 backgroundColorLabel=Label(root,text='背景颜色',font=('微软雅黑',10)) backgroundColor=Button(root,background=bgColor,bd=0,command=changeBgColor)#背景颜色 newPaintPage=Button(root,text='画新的一张',font=('微软雅黑',15),command=createNewPage)#创建新的一张画布按钮 lastPage.place(x=20,y=10) nextPage.place(x=100,y=10) pageLabel.place(x=50,y=13) paintColorLabel.place(x=20,y=height+100) paintColor.place(x=80,y=height+100,width=20,height=20) backgroundColorLabel.place(x=120,y=height+100) backgroundColor.place(x=180,y=height+100,width=20,height=20) newPaintPage.place(x=250,y=height+100) menu=Menu(root)#创建菜单对象 menuFile=Menu(menu,tearoff=False)#tearoff意思为能从窗口分离 menuOperate=Menu(menu,tearoff=False) menu.add_cascade(label='文件',menu=menuFile) menuFile.add_command(label='创建新一页',command=createNewPage) menuFile.add_command(label='上一页',command=toLast) menuFile.add_command(label='下一页',command=toNext) menuFile.add_command(label='删除本页',command=deletePage) menuFile.add_command(label='保存为.avi',command=saveAvi) menuFile.add_command(label='保存为.mp4',command=saveMp4) menuFile.add_command(label='另存为.avi',command=toSaveAvi) menuFile.add_command(label='另存为.mp4',command=toSaveMp4) menu.add_cascade(label='操作',menu=menuOperate) menuOperate.add_command(label='更换画笔颜色',command=changeColor) menuOperate.add_command(label='更换背景颜色',command=changeBgColor) menu.add_command(label='关于',command=about) root.config(menu=menu) ##菜单功能 createNewPage()#创建第一页 root.mainloop() ##绘画界面 start() if __name__=='__main__': main()

能画成这样!