2017-10-17 4 views
1
として

Iは、zipファイルkivy画像に複数の画像を含み、すべての画像を通してそれがサイクルすることアウト校正をロードする能力をテストしています。私は以前にこれらの例を試してみましたロードANにKivyImage

https://groups.google.com/forum/#!topic/kivy-users/t_iKvpgLIzE https://kivy.org/docs/api-kivy.core.image.html

私は仕事にこれらを取得することができ、しかし、私はそのような状況の下で.zipファイルまたは.GIFファイルをロードする例を見つけることができません。

私は、zipファイルがメモリ内にある場合、画像を含むzipファイルを読み込むことができるかどうかを確認するように要求します。または、メモリからロードされた画像からアニメーションを作成することが可能な場合。

ValueError: Image.source accept only str 

答えて

1

ここで働いている例:ここでは

import io 
import zipfile 
from kivy.core.image import Image as CoreImage 
from kivy.uix.image import Image 
from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 

class testApp(App): 

    def get_image_from_memory(self): 
     with io.BytesIO(open("archer_F_idle.zip", "rb").read()) as f: 
      imgzip = f.read() 
      print(imgzip) 
      zipped_imgs = zipfile.ZipFile(f) 
      print(zipped_imgs, zipped_imgs.namelist(),zipped_imgs.filename) 


     return Image(source=zipped_imgs) 


    def build(self): 
     self.b = BoxLayout() 
     self.b.add_widget(self.get_image_from_memory()) 
     return self.b 

if __name__ == '__main__': 
    testApp().run() 

は次のエラーです。

import io 
import zipfile 
from kivy.core.image import Image as CoreImage 
from kivy.uix.image import Image 
from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 


class testApp(App):  
    def get_image_from_memory(self): 
     with zipfile.ZipFile("C:/Users/gmn/Downloads/Cover.zip") as myzip: 
      with myzip.open('Cover.jpg') as myfile: 
       ci = CoreImage(io.BytesIO(myfile.read()), ext="jpg") 
       return Image(texture=ci.texture) 

    def build(self): 
     self.b = BoxLayout() 
     self.b.add_widget(self.get_image_from_memory()) 
     return self.b 


if __name__ == '__main__': 
    testApp().run() 

UPD:

Zipファイルが1枚のまたは複数の画像が含まれている必要があり、あなたがあなたにジップファイル名と画像EXC /ファイル名を変更していることを確認します。

import io 
import zipfile 
from itertools import cycle 

from kivy.clock import Clock 
from kivy.core.image import Image as CoreImage 
from kivy.uix.image import Image 
from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import StringProperty 


class ZipAnimationImage(Image): 
    zip_source = StringProperty('') 

    def __init__(self, **kwargs): 
     self._cycle = None 
     super(Image, self).__init__(**kwargs) 
     Clock.schedule_interval(self._update, 1.0) 

    def _update(self, *args): 
     if self._cycle: 
      self.texture = next(self._cycle).texture 

    def on_zip_source(self, *args): 
     cis = [] 
     with zipfile.ZipFile(self.zip_source) as z: 
      names = z.namelist() 
      for name in names: 
       ext = name.split('.')[-1] 
       with z.open(name) as f: 
        ci = CoreImage(io.BytesIO(f.read()), ext=ext) 
        cis.append(ci) 
     self._cycle = cycle(cis) if cis else None 


class testApp(App): 
    def build(self): 
     self.b = BoxLayout() 
     self.b.add_widget(ZipAnimationImage(zip_source='C:/Users/gmn/Downloads/test.zip')) 
     return self.b 


if __name__ == '__main__': 
    testApp().run() 
+0

ミハイル、お返事ありがとうございました。はい、それは間違いなく動作しますが、Image Widgetに.zipファイルを直接フィードし、アニメーションのようなすべてのイメージを循環させるのと同じ方法で、複数のイメージを読み込む方法を変更するにはどうすればよいでしょうか?私は、さまざまなイメージを含むzipファイルの複数のバリエーションを読み込み、必要に応じて呼び出すことを計画しています。 –

+0

@KevinAlvarezプロトタイプで答えを更新しました。あなたを正しく理解すれば、あなたがしたいことをします。 –

+0

ありがとうございます!これは正確に動作します、私は座って、起こっているすべてを消化する必要があります。解決策に関する質問があれば、私はあなたを迎えてくれるでしょう。そうでなければ、私の質問に答えました! –

関連する問題