Lập trình tạo video hoặc GIF hoạt hình trong Python?


221

Tôi có một loạt hình ảnh mà tôi muốn tạo video từ đó. Lý tưởng nhất là tôi có thể chỉ định thời lượng khung hình cho mỗi khung hình nhưng tốc độ khung hình cố định cũng sẽ ổn. Tôi đang làm điều này trong wxPython, vì vậy tôi có thể kết xuất thành wxDC hoặc tôi có thể lưu hình ảnh vào các tệp, như PNG. Có thư viện Python nào cho phép tôi tạo video (AVI, MPG, v.v.) hoặc GIF động từ các khung này không?

Chỉnh sửa: Tôi đã thử PIL và nó dường như không hoạt động. Ai đó có thể sửa cho tôi với kết luận này hoặc đề nghị một bộ công cụ khác không? Liên kết này dường như sao lưu kết luận của tôi về PIL: http://www.somethinkodd.com/oddthinking/2005/12/06/python-imaging-l Library-pil-and-ray-gifs /

Câu trả lời:


281

Tôi khuyên bạn không nên sử dụng hình ảnh2gif từ visvis vì nó có vấn đề với PIL / Gối và không được duy trì tích cực (tôi nên biết, vì tôi là tác giả).

Thay vào đó, vui lòng sử dụng imageio , được phát triển để giải quyết vấn đề này và hơn thế nữa, và dự định ở lại.

Giải pháp nhanh và bẩn:

import imageio
images = []
for filename in filenames:
    images.append(imageio.imread(filename))
imageio.mimsave('/path/to/movie.gif', images)

Đối với phim dài hơn, hãy sử dụng phương pháp phát trực tuyến:

import imageio
with imageio.get_writer('/path/to/movie.gif', mode='I') as writer:
    for filename in filenames:
        image = imageio.imread(filename)
        writer.append_data(image)

37
còn thời lượng tham số = 0,5 đặt thời lượng 0,5 giây cho mỗi khung.
Alleo

3
ValueError: Không thể tìm thấy định dạng để đọc tệp được chỉ định trong chế độ 'i' - Tôi đang gặp lỗi này trên windows 2.7 winpython. Bất kì manh mối nào?
Vanko

1
@Vanko lỗi dường như có liên quan đến việc đọc tệp, bạn có thể thử fantio.mimread hoặc nếu phim có nhiều khung, hãy sử dụng đối tượng người đọc như ở đây: imageio.readthedocs.io/en/latest/ tựa
Almar

2
@Alleo: "cũng có thời lượng tham số = 0,5 đặt thời lượng 0,5 giây cho mỗi khung hình". Có một tính năng thời lượng cho imageio? Nếu vậy, tài liệu này ở đâu? Tôi đọc tất cả các tài liệu và không thể tìm thấy bất kỳ đề cập nào về một đối số thời lượng.
Chris Nielsen

3
Thông minh! imageio in anacondanăng suất True, yay!
uhoh

47

Chà, giờ tôi đang sử dụng ImageMagick. Tôi lưu các khung của mình dưới dạng tệp PNG và sau đó gọi convert.exe của ImageMagick từ Python để tạo GIF động. Điều thú vị về cách tiếp cận này là tôi có thể chỉ định thời lượng khung cho từng khung riêng lẻ. Thật không may, điều này phụ thuộc vào ImageMagick được cài đặt trên máy. Họ có một trình bao bọc Python nhưng nó trông khá nhảm nhí và không được hỗ trợ. Vẫn mở cho các đề xuất khác.


21
Tôi là một người Python nhưng thấy ImageMagick dễ dàng hơn nhiều ở đây. Tôi vừa thực hiện chuỗi hình ảnh của mình và chạy một cái gì đó nhưconvert -delay 20 -loop 0 *jpg animated.gif
Nick

Tôi đồng ý, đây là giải pháp tốt nhất mà tôi đã gặp. Đây là một ví dụ tối thiểu (dựa trên mã ví dụ của người dùng Steve B được đăng tại stackoverflow.com/questions/10922285/
mẹo

Sử dụng ImageMagick, bạn cũng có thể dễ dàng thay đổi kích thước gif hoạt hình nhưconvert -delay 20 -resize 300x200 -loop 0 *jpg animated.gif
Jun Wang

@Nick, Làm thế nào để bạn chạy mã đó để tạo GIF? Tôi có nên nhập bất cứ thứ gì vào Spyder IDE không?
MOON

@MOON lệnh ImageMagic tôi đã thêm ở trên chỉ chạy qua dòng lệnh.
Nick

43

Kể từ tháng 6 năm 2009, bài đăng trên blog được trích dẫn ban đầu có một phương pháp để tạo GIF động trong các bình luận . Tải xuống tập lệnh hình ảnh2gif.py (trước đây là hình ảnh2gif.py , cập nhật lịch sự của @geographika).

Sau đó, để đảo ngược các khung trong một gif, ví dụ:

#!/usr/bin/env python

from PIL import Image, ImageSequence
import sys, os
filename = sys.argv[1]
im = Image.open(filename)
original_duration = im.info['duration']
frames = [frame.copy() for frame in ImageSequence.Iterator(im)]    
frames.reverse()

from images2gif import writeGif
writeGif("reverse_" + os.path.basename(filename), frames, duration=original_duration/1000.0, dither=0)

2
Có một phiên bản mới của tập lệnh này tạo ra chất lượng đầu ra tốt hơn nhiều tại visvis.googlecode.com/hg/vvmovie/images2gif.py nó có thể được sử dụng như một tập lệnh độc lập tách biệt với gói.
geographika

1
Kịch bản được đề cập trong nhận xét này luôn gây ra lỗi phân đoạn cho tôi khi được sử dụng trên Mac, ngay cả khi chỉ đơn giản là chạy (sử dụng tên __ == '__ chính ' ví dụ). Tôi đang thử kịch bản được đề cập trong câu trả lời, với hy vọng rằng nó sẽ hoạt động tốt. EDIT - Tôi có thể xác nhận rằng tập lệnh được tham chiếu trong câu trả lời ở trên hoạt động chính xác trên máy Mac của tôi.
scubbo

6
Thay vì chỉ tải xuống tập lệnh, hãy sử dụng pip pip install visvis, ví dụ như trong tập lệnh của bạn from visvis.vvmovie.images2gif import writeGif.
Daniel Farrell

8
Tôi đã thử điều này với Python 2.7.3 trên windows 8 và tôi nhận được UnicodeDecodeError: 'ascii' codec không thể giải mã byte 0xc8 ở vị trí 6: thứ tự không nằm trong phạm vi (128). Từ việc chạy python hình ảnh2gif.py
reckoner

3
Tôi là tác giả của visivis (và hình ảnh2gif) và đề nghị không sử dụng nó cho mục đích này. Tôi đã nghiên cứu một giải pháp tốt hơn như là một phần của dự án imageio (xem câu trả lời của tôi).
Almar

40

Đây là cách bạn làm điều đó chỉ bằng PIL (cài đặt với pip install Pillow:):

import glob
from PIL import Image

# filepaths
fp_in = "/path/to/image_*.png"
fp_out = "/path/to/image.gif"

# https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#gif
img, *imgs = [Image.open(f) for f in sorted(glob.glob(fp_in))]
img.save(fp=fp_out, format='GIF', append_images=imgs,
         save_all=True, duration=200, loop=0)

4
đây phải là câu trả lời được chấp nhận, cảm ơn bạn
@Kris

1
Biến dấu hoa thị giữ gì ("* imss")?
denvd411

3
Đó là một tính năng ngôn ngữ python. Nó không lặp lại giải nén . Bạn gần như có thể nghĩ về nó như giải nén x = [a, b, c]để *xcó thể được coi là a, b, c(không có dấu ngoặc kèm theo). Trong chức năng gọi đây là đồng nghĩa : f(*x) == f(a, b, c). Trong bộ giải nén, nó đặc biệt hữu ích trong trường hợp bạn muốn tách một lần lặp thành một phần đầu (phần tử đầu tiên) và phần đuôi (phần còn lại), đó là những gì tôi làm trong ví dụ này.
Kris

25

Tôi đã sử dụng hình ảnh2gif.py rất dễ sử dụng. Nó dường như đã tăng gấp đôi kích thước tập tin mặc dù ..

26 tệp PNG 110kb, tôi mong đợi 26 * 110kb = 2860kb, nhưng my_gif.GIF là 5,7mb

Ngoài ra vì GIF là 8 bit, png đẹp trở nên hơi mờ trong GIF

Đây là mã tôi đã sử dụng:

__author__ = 'Robert'
from images2gif import writeGif
from PIL import Image
import os

file_names = sorted((fn for fn in os.listdir('.') if fn.endswith('.png')))
#['animationframa.png', 'animationframb.png', 'animationframc.png', ...] "

images = [Image.open(fn) for fn in file_names]

print writeGif.__doc__
# writeGif(filename, images, duration=0.1, loops=0, dither=1)
#    Write an animated gif from the specified images.
#    images should be a list of numpy arrays of PIL images.
#    Numpy images of type float should have pixels between 0 and 1.
#    Numpy images of other types are expected to have values between 0 and 255.


#images.extend(reversed(images)) #infinit loop will go backwards and forwards.

filename = "my_gif.GIF"
writeGif(filename, images, duration=0.2)
#54 frames written
#
#Process finished with exit code 0

Dưới đây là 3 trong số 26 khung hình:

Dưới đây là 3 trong số 26 khung

thu nhỏ hình ảnh giảm kích thước:

size = (150,150)
for im in images:
    im.thumbnail(size, Image.ANTIALIAS)

gif nhỏ hơn


Tôi đã tạo một bài đăng trên blog về điều này .. robert-king.com/#post2-python-makes-gif
robert king

2
Tôi gặp lỗi .. Tệp "C: \ Python27 \ lib \ images2gif.py", dòng 418, trong writeGifToFile globalPalette = palettes [xảy ra.index (max (xảy ra))] ValueError: max () arg là một chuỗi trống
Harry

xảy ra có lẽ là trống rỗng. Tệp hình ảnh2gif.py của tôi không có biến "globalPalette".
vua robert

Làm thế nào để tôi thay đổi điều đó? Tôi đang sử dụng tập lệnh hình ảnh2gif.py gần đây nhất ( bit.ly/XMMn5h )
Harry

4
@robertking với mã Tôi gặp lỗi khi nóifp.write(globalPalette) TypeError: must be string or buffer, not list
LWZ

19

Để tạo video, bạn có thể sử dụng opencv ,

#load your frames
frames = ...
#create a video writer
writer = cvCreateVideoWriter(filename, -1, fps, frame_size, is_color=1)
#and write your frames in a loop if you want
cvWriteFrame(writer, frames[i])

9

Tôi đã xem qua bài đăng này và không có giải pháp nào hiệu quả, vì vậy đây là giải pháp của tôi có hiệu quả

Các vấn đề với các giải pháp khác cho đến nay:
1) Không có giải pháp rõ ràng nào về cách thay đổi thời lượng
2) Không có giải pháp nào cho việc lặp lại thư mục không theo thứ tự, điều này rất cần thiết cho GIF
3) Không có giải thích về cách cài đặt imageio cho python 3

cài đặt imageio như thế này: python3 -m pip cài đặt imageio

Lưu ý: bạn sẽ muốn đảm bảo các khung của bạn có một số loại chỉ mục trong tên tệp để chúng có thể được sắp xếp, nếu không bạn sẽ không có cách nào để biết GIF bắt đầu hoặc kết thúc ở đâu

import imageio
import os

path = '/Users/myusername/Desktop/Pics/' # on Mac: right click on a folder, hold down option, and click "copy as pathname"

image_folder = os.fsencode(path)

filenames = []

for file in os.listdir(image_folder):
    filename = os.fsdecode(file)
    if filename.endswith( ('.jpeg', '.png', '.gif') ):
        filenames.append(filename)

filenames.sort() # this iteration technique has no built in order, so sort the frames

images = list(map(lambda filename: imageio.imread(filename), filenames))

imageio.mimsave(os.path.join('movie.gif'), images, duration = 0.04) # modify duration as needed

1
sortcó thể mang lại kết quả bất ngờ nếu sơ đồ đánh số của bạn không bao gồm các số 0 đứng đầu. Ngoài ra tại sao bạn sử dụng bản đồ thay vì hiểu danh sách đơn giản?
NOh

Tôi muốn đề nghị làmfilenames.append(os.path.join(path, filename))
trueter

Secodning Nohs, images = [imageio.imread(f) for f in filenames]sạch hơn, nhanh hơn và nhiều pythonic hơn.
Brandon Dube

6

Giống như Warren đã nói năm ngoái , đây là một câu hỏi cũ. Vì mọi người dường như vẫn đang xem trang, tôi muốn chuyển hướng họ đến một giải pháp hiện đại hơn. Giống như blakev đã nói ở đây , có một ví dụ về Gối trên github .

 import ImageSequence
 import Image
 import gifmaker
 sequence = []

 im = Image.open(....)

 # im is your original image
 frames = [frame.copy() for frame in ImageSequence.Iterator(im)]

 # write GIF animation
 fp = open("out.gif", "wb")
 gifmaker.makedelta(fp, frames)
 fp.close()

Lưu ý: Ví dụ này đã lỗi thời ( gifmakerkhông phải là mô-đun có thể nhập, chỉ là tập lệnh). Gối có GifImagePlugin (có nguồn trên GitHub ), nhưng tài liệu trên ImageSequence dường như chỉ ra sự hỗ trợ hạn chế (chỉ đọc)



5

Câu hỏi cũ, rất nhiều câu trả lời hay, nhưng vẫn có thể có hứng thú với một lựa chọn khác ...

Các numpngwmô-đun mà tôi vừa đặt lên trên github ( https://github.com/WarrenWeckesser/numpngw ) có thể viết các file PNG hoạt hình từ mảng NumPy. ( Cập nhật : numpngwhiện đã có trên pypi: https://pypi.python.org/pypi/numpngw .)

Ví dụ: tập lệnh này:

import numpy as np
import numpngw


img0 = np.zeros((64, 64, 3), dtype=np.uint8)
img0[:32, :32, :] = 255
img1 = np.zeros((64, 64, 3), dtype=np.uint8)
img1[32:, :32, 0] = 255
img2 = np.zeros((64, 64, 3), dtype=np.uint8)
img2[32:, 32:, 1] = 255
img3 = np.zeros((64, 64, 3), dtype=np.uint8)
img3[:32, 32:, 2] = 255
seq = [img0, img1, img2, img3]
for img in seq:
    img[16:-16, 16:-16] = 127
    img[0, :] = 127
    img[-1, :] = 127
    img[:, 0] = 127
    img[:, -1] = 127

numpngw.write_apng('foo.png', seq, delay=250, use_palette=True)

tạo ra:

hoạt hình png

Bạn sẽ cần một trình duyệt hỗ trợ PNG hoạt hình (trực tiếp hoặc với plugin) để xem hoạt hình.


Chrome bây giờ cũng vậy, BTW. Một câu hỏi - seq có thể lặp lại được không? Bạn có hỗ trợ "truyền phát" (tức là mở APNG mục tiêu và thêm từng khung hình một trong một vòng lặp) không?
Tomasz Gandor

Nó không hỗ trợ một lần lặp hoặc phát trực tuyến tùy ý, nhưng điều đó không có nghĩa là nó không thể trong tương lai. :) Tạo một vấn đề trên trang github với cải tiến được đề xuất. Nếu bạn có bất kỳ ý tưởng nào về API cho tính năng này, vui lòng mô tả chúng trong vấn đề này.
Warren Weckesser

Tôi đã có một số lỗi kỳ lạ mà tôi đã gây ra sự cố trên repo của bạn.
mLstudent33

5

Như một thành viên đã đề cập ở trên, imageio là một cách tuyệt vời để làm điều này. imageio cũng cho phép bạn đặt tốc độ khung hình và tôi thực sự đã viết một hàm trong Python cho phép bạn đặt giữ khung hình cuối cùng. Tôi sử dụng chức năng này cho các hình ảnh động khoa học trong đó việc lặp lại là hữu ích nhưng khởi động lại ngay lập tức thì không. Đây là liên kết và chức năng:

Cách tạo ảnh GIF bằng Python

import matplotlib.pyplot as plt
import os
import imageio

def gif_maker(gif_name,png_dir,gif_indx,num_gifs,dpi=90):
    # make png path if it doesn't exist already
    if not os.path.exists(png_dir):
        os.makedirs(png_dir)

    # save each .png for GIF
    # lower dpi gives a smaller, grainier GIF; higher dpi gives larger, clearer GIF
    plt.savefig(png_dir+'frame_'+str(gif_indx)+'_.png',dpi=dpi)
    plt.close('all') # comment this out if you're just updating the x,y data

    if gif_indx==num_gifs-1:
        # sort the .png files based on index used above
        images,image_file_names = [],[]
        for file_name in os.listdir(png_dir):
            if file_name.endswith('.png'):
                image_file_names.append(file_name)       
        sorted_files = sorted(image_file_names, key=lambda y: int(y.split('_')[1]))

        # define some GIF parameters

        frame_length = 0.5 # seconds between frames
        end_pause = 4 # seconds to stay on last frame
        # loop through files, join them to image array, and write to GIF called 'wind_turbine_dist.gif'
        for ii in range(0,len(sorted_files)):       
            file_path = os.path.join(png_dir, sorted_files[ii])
            if ii==len(sorted_files)-1:
                for jj in range(0,int(end_pause/frame_length)):
                    images.append(imageio.imread(file_path))
            else:
                images.append(imageio.imread(file_path))
        # the duration is the time spent on each image (1/duration is frame rate)
        imageio.mimsave(gif_name, images,'GIF',duration=frame_length)

Ví dụ GIF sử dụng phương pháp này



4

Với windows7, python2.7, opencv 3.0, các công việc sau đây đối với tôi:

import cv2
import os

vvw           =   cv2.VideoWriter('mymovie.avi',cv2.VideoWriter_fourcc('X','V','I','D'),24,(640,480))
frameslist    =   os.listdir('.\\frames')
howmanyframes =   len(frameslist)
print('Frames count: '+str(howmanyframes)) #just for debugging

for i in range(0,howmanyframes):
    print(i)
    theframe = cv2.imread('.\\frames\\'+frameslist[i])
    vvw.write(theframe)

3

Điều dễ nhất làm cho nó hoạt động với tôi là gọi một lệnh shell trong Python.

Nếu hình ảnh của bạn được lưu trữ như dummy_image_1.png, dummy_image_2.png ... dummy_image_N.png, thì bạn có thể sử dụng chức năng:

import subprocess
def grid2gif(image_str, output_gif):
    str1 = 'convert -delay 100 -loop 1 ' + image_str  + ' ' + output_gif
    subprocess.call(str1, shell=True)

Chỉ cần thực hiện:

grid2gif("dummy_image*.png", "my_output.gif")

Điều này sẽ xây dựng tệp gif của bạn myDefput.gif.


2

Tác vụ có thể được hoàn thành bằng cách chạy tập lệnh python hai dòng từ cùng một thư mục với chuỗi các tập tin hình ảnh. Đối với các tệp được định dạng png, tập lệnh là -

from scitools.std import movie
movie('*.png',fps=1,output_file='thisismygif.gif')

1
Đã thử nó ... không hoạt động với tôi theo Python 2.6. Trả về: "Hàm scitools.easyviz.movie chạy lệnh: / convert -delay 100 g4testC _ *. Png g4testC.gif / Tham số không hợp lệ - 100"
Dan H

Vấn đề không phải là với Python chắc chắn. Cài đặt lại hình ảnh trên hệ thống của bạn và thử lại.
ArKE

2

Tôi đã tìm kiếm một mã dòng duy nhất và tìm thấy những điều sau đây để làm việc cho ứng dụng của tôi. Đây là những gì tôi đã làm:

Bước đầu tiên: Cài đặt ImageMagick từ liên kết bên dưới

https://www.imagemagick.org/script/doad.php

nhập mô tả hình ảnh ở đây

Bước thứ hai: Trỏ dòng cmd vào thư mục chứa hình ảnh (trong trường hợp của tôi là định dạng .png)

nhập mô tả hình ảnh ở đây

Bước thứ ba: Nhập lệnh sau

magick -quality 100 *.png outvideo.mpeg

nhập mô tả hình ảnh ở đây

Cảm ơn FogleBird cho ý tưởng!


0

Tôi chỉ thử những điều sau đây và rất hữu ích:

Đầu tiên Tải xuống các thư viện Figtodatimages2gifvào thư mục địa phương của bạn.

Thứ hai Thu thập các số liệu trong một mảng và chuyển đổi chúng thành một gif hoạt hình:

import sys
sys.path.insert(0,"/path/to/your/local/directory")
import Figtodat
from images2gif import writeGif
import matplotlib.pyplot as plt
import numpy

figure = plt.figure()
plot   = figure.add_subplot (111)

plot.hold(False)
    # draw a cardinal sine plot
images=[]
y = numpy.random.randn(100,5)
for i in range(y.shape[1]):
    plot.plot (numpy.sin(y[:,i]))  
    plot.set_ylim(-3.0,3)
    plot.text(90,-2.5,str(i))
    im = Figtodat.fig2img(figure)
    images.append(im)

writeGif("images.gif",images,duration=0.3,dither=0)

0

Tôi đã bắt gặp mô-đun ImageSequence của PIL , cung cấp một phiên bản GIF tốt hơn (và chuẩn hơn). Tôi cũng sử dụng phương thức after () của Tk lần này, tốt hơn so với time.s ngủ () .

from Tkinter import * 
from PIL import Image, ImageTk, ImageSequence

def stop(event):
  global play
  play = False
  exit() 

root = Tk()
root.bind("<Key>", stop) # Press any key to stop
GIFfile = {path_to_your_GIF_file}
im = Image.open(GIFfile); img = ImageTk.PhotoImage(im)
delay = im.info['duration'] # Delay used in the GIF file 
lbl = Label(image=img); lbl.pack() # Create a label where to display images
play = True;
while play:
  for frame in ImageSequence.Iterator(im):
    if not play: break 
    root.after(delay);
    img = ImageTk.PhotoImage(frame)
    lbl.config(image=img); root.update() # Show the new frame/image

root.mainloop()

0

Một chức năng đơn giản giúp tạo ảnh GIF:

import imageio
import pathlib
from datetime import datetime


def make_gif(image_directory: pathlib.Path, frames_per_second: float, **kwargs):
    """
    Makes a .gif which shows many images at a given frame rate.
    All images should be in order (don't know how this works) in the image directory

    Only tested with .png images but may work with others.

    :param image_directory:
    :type image_directory: pathlib.Path
    :param frames_per_second:
    :type frames_per_second: float
    :param kwargs: image_type='png' or other
    :return: nothing
    """
    assert isinstance(image_directory, pathlib.Path), "input must be a pathlib object"
    image_type = kwargs.get('type', 'png')

    timestampStr = datetime.now().strftime("%y%m%d_%H%M%S")
    gif_dir = image_directory.joinpath(timestampStr + "_GIF.gif")

    print('Started making GIF')
    print('Please wait... ')

    images = []
    for file_name in image_directory.glob('*.' + image_type):
        images.append(imageio.imread(image_directory.joinpath(file_name)))
    imageio.mimsave(gif_dir.as_posix(), images, fps=frames_per_second)

    print('Finished making GIF!')
    print('GIF can be found at: ' + gif_dir.as_posix())


def main():
    fps = 2
    png_dir = pathlib.Path('C:/temp/my_images')
    make_gif(png_dir, fps)

if __name__ == "__main__":
    main()

0

Tôi hiểu bạn đã hỏi về việc chuyển đổi hình ảnh sang gif; tuy nhiên, nếu định dạng ban đầu là MP4, bạn có thể sử dụng FFmpeg :

ffmpeg -i input.mp4 output.gif

-1

Điều đó thực sự đáng kinh ngạc ... Tất cả đang đề xuất một số gói đặc biệt để phát GIF động, tại thời điểm đó có thể được thực hiện với Tkinter và mô-đun PIL cổ điển!

Đây là phương pháp hoạt hình GIF của riêng tôi (tôi đã tạo cách đây một thời gian). Rất đơn giản:

from Tkinter import * 
from PIL import Image, ImageTk
from time import sleep

def stop(event):
  global play
  play = False
  exit() 

root = Tk()
root.bind("<Key>", stop) # Press any key to stop
GIFfile = {path_to_your_GIF_file}    
im = Image.open(GIFfile); img = ImageTk.PhotoImage(im)
delay = float(im.info['duration'])/1000; # Delay used in the GIF file 
lbl = Label(image=img); lbl.pack() # Create a label where to display images
play = True; frame = 0
while play:
  sleep(delay);
  frame += 1
  try:
    im.seek(frame); img = ImageTk.PhotoImage(im)
    lbl.config(image=img); root.update() # Show the new frame/image
  except EOFError:
    frame = 0 # Restart

root.mainloop()

Bạn có thể thiết lập phương tiện của riêng bạn để dừng hoạt hình. Hãy cho tôi biết nếu bạn muốn có phiên bản đầy đủ với các nút phát / tạm dừng / thoát.

Lưu ý: Tôi không chắc chắn nếu các khung liên tiếp được đọc từ bộ nhớ hoặc từ tệp (đĩa). Trong trường hợp thứ hai, sẽ hiệu quả hơn nếu tất cả chúng đọc cùng một lúc và lưu vào một mảng (danh sách). (Tôi không quan tâm lắm để tìm hiểu! :)


1
Nói chung, đó không phải là một lý tưởng tốt để gọi sleeptrong luồng chính của GUI. Bạn có thể sử dụng afterphương thức để gọi một hàm theo định kỳ.
Bryan Oakley

Bạn nói đúng, nhưng đây không phải là vấn đề, phải không? Điểm là toàn bộ phương pháp. Vì vậy, tôi muốn mong đợi một phản ứng với điều đó!
Apostolos

1
Tôi chỉ cố gắng đưa ra lời khuyên về cách cải thiện câu trả lời của bạn.
Bryan Oakley

BTW, tôi thường sử dụng tk.after()bản thân mình. Nhưng ở đây tôi cần phải làm cho mã đơn giản nhất có thể. Bất cứ ai sử dụng phương pháp hoạt hình GIF này đều có thể áp dụng chức năng trì hoãn của riêng mình.
Apostolos

Cuối cùng! Vâng, đây thực sự là một điểm rất tốt. Tôi đã lạc đề! Cảm ơn, @Nigs. (Thật thú vị khi xem mặc dù những người khác đã bỏ lỡ điều này như thế nào, ví dụ Bryan, người đang nói về phương pháp trì hoãn thời gian!)
Apostolos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.