介绍
只有tkinter和Pillow需要,用Image.save(save_all=1)实现
其实很少人知道,append_images可以传入iter
代码
import os
import time
import tempfile
import tkinter as tk
from tkinter import ttk
import tkinter.filedialog as fd
from PIL import ImageGrab
from PIL import Image
def get_geometry():
imf.update()
x = imf.winfo_rootx()
y = imf.winfo_rooty()
w = imf.winfo_width()
h = imf.winfo_height()
return x,y,w+x,h+y
def start():
global cam
if cam:return
cam = 1
geo = get_geometry()
r = root.geometry()
b1["state"] = "disabled"
b3["state"] = "disabled"
path = tempfile.mkdtemp(prefix="SGC_",suffix="TMP")
start = time.time()
fmt = path+"/screen_%d.jpg"
first = ImageGrab.grab(geo)
leng = 1
truequality = (1,25,50,75,95)[quality-1]
#if use resizable,it will flash
root.minsize(root.winfo_width(),root.winfo_height())
root.maxsize(root.winfo_width(),root.winfo_height())
while cam:
try:ImageGrab.grab(get_geometry()).save(fmt%leng,quality=truequality)
except:return
leng += 1
root.update()
dur = round((time.time()-start)/(leng),2)
dur /= speed
fn = fd.asksaveasfilename(filetypes=(("GIF animate",".gif"),),defaultextension=".gif")
if not fn:
for n in getimg(path):
#to remove temp
pass
b1["state"] = "normal"
b2["state"] = "normal"
b3["state"] = "normal"
return
first.save(fn,save_all=1,append_images=getimg(path),duration=dur,quality=truequality)
root.minsize(Width,Height)
root.maxsize(root.winfo_screenwidth(),root.winfo_screenheight())
b1["state"] = "normal"
b2["state"] = "normal"
b3["state"] = "normal"
def end():
global cam
if cam:
b2["state"] = "disabled"
cam = 0
def getimg(path):
for name in sorted(os.listdir(path),key=len):
name = path+"/"+name
im = Image.open(name)
im.load()
os.remove(name)
root.update()
yield im
#os.remove(path)
def about():
top = tk.Toplevel()
top.transient(root)
top.grab_set()
top.title("About")
top.resizable(0,0)
top.focus_set()
tk.Label(top,font="Arial 20",text="SimpleGIFCam").pack()
s = tk.Scale(top,orient="horizontal",label="Quality",from_=1,to=5,command=choosequality)
s.pack()
s.set(quality)
s = tk.Scale(top,orient="horizontal",label="Speed",from_=-3,to=3,command=choosespeed)
s.pack()
s.set(1)
root.wait_window(top)
def choosequality(num):
global quality
quality = int(num)
def choosespeed(num):
global speed
num = int(num)
speed = (1,1,2,3,0.3,0.5,1)[num]
cam = 0
quality = 3
speed = 1
root = tk.Tk()
root.attributes("-transparentcolor","#fffff0")
root.title("SimpleGIFCam 1.2")
f = tk.Frame(bg="blue",width=300,height=200)
f.pack(fill="both",expand=1)
imf = tk.Frame(f,bg="#fffff0")
imf.place(relx=0.1,rely=0.1,relwidth=0.8,relheight=0.6)
b1 = tk.Button(f,text="Start",command=start)
b1.place(relx=0.1,rely=0.8,relwidth=0.2,relheight=0.18)
b2 = tk.Button(f,text="End",command=end)
b2.place(relx=0.5,rely=0.8,relwidth=0.2,relheight=0.18)
b3 = tk.Button(f,bitmap="questhead",command=about)
b3.place(relx=0.8,rely=0.8,relwidth=0.1,relheight=0.18)
ttk.Style().configure("S.TSizegrip",background="blue")
ttk.Sizegrip(f,style="S.TSizegrip").place(relx=0.9,rely=0.9,relwidth=0.1,relheight=0.1)
for b in (b1,b2,b3):
b.config(bg="blue",fg="white",borderwidth=1,relief="flat",activebackground="#00ffff",font="TkDefaultFont 16",disabledforeground="black")
root.update()
Width = root.winfo_width()
Height = root.winfo_height()
root.minsize(Width,Height)
root.mainloop()
效果
本文发于CSDN于 2021/12/26 7:39