首页
公开文件分享
音乐分享
游戏分享
工具分享
其它文件分享
文章
随笔
聊天大厅
小工具
小游戏
关于我们
登录
注册
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()
能画成这样!