2
をスピードアップ私が仕事をしやすいTkinterではアニメーションGIFを表示するためのクラスを作ることにしましたが、動的にほとんどすべてのフレームを収集するプロセスは、常に時間の顕著な塊を取り、起こってから何かを防ぎますそれが終わるまで。私はそれをスピードアップする方法があるのか、同じことをするより効率的な方法があるのだろうと思っていました。ここでは、潜在的に長いタスク
は、クラスのコードです:
from tkinter import *
class animation:
def __init__(self,*args,**kwargs):
self.root=args[0]
self.label=Label(self.root)
self.label.grid()
self.image=kwargs["image"]
try:
self.delay=kwargs["delay"]
except KeyError:
self.delay=20
self.frames=[]
x=0
while True:
try:
img=PhotoImage(file=self.image,
format="gif -index {}".format(x))
self.frames.append(img)
x+=1
except:
break
def animate(self,y):
try:
self.label.configure(image=self.frames[y])
self.root.after(self.delay,lambda:self.animate(y+1))
except IndexError:
self.label.configure(image=self.frames[0])
self.root.after(self.delay,lambda:self.animate(1))
、ここではそれが使用される方法です:
from tkinter import *
from modules.animation import animation
root=Tk()
cosmog=animation(root,image="cosmog.gif").animate(0)
cosmoem=animation(root,image="cosmoem.gif").animate(0)
lunala=animation(root,image="lunala.gif").animate(0)
root.mainloop()
多分、tkinterを始める前にすべてのイメージを読むクラスを作成してください。あるいは、スレッドを使ってファイルを読むこともできます。 – furas
これはあまり役に立ちませんが、イメージを一度ロードしてから、フレームごとにHDDからイメージをロードするのではなく、すべてのフレームを引き出す必要があります。 [これはどうしたのですか](https://stackoverflow.com/a/43770948/2229945)。また、現在のウィジェットをサブクラス化することによって、tkinterウィジェットを作成する適切な方法に注目してください。そうすれば、コード内の他のウィジェット(パック、グリッド、tkraiseなど)と同じように扱うことができます。代わりに、 'self.root.after(self.delay、ラムダ:self.animate(1))の – Novel
FWIW、' 'あなたはself.root.after使用することができます(self.delay、self.animateを、1)' –