python3.8.0、Kivyを用いて簡単な画像ビューアプリを作成しています。
画像の入ったzipを読み込み、PIL、Textureを用いてKivyのImageにのせ、Carouselにadd_widgetしています。
質問はこの方法をとった場合、Carouselは画像の全てを読み込んでからしか表示されず、画像枚数が多い場合に待ち時間が長くなってしまいます。
画像の一枚目を読み込んだ時点でCarouselを表示し、それと並行して順次Imageを読み込んで行って欲しいのですがどのようなファクターを用いれば達成できるでしょうか。
pyファイル
main
1from kivy.app import App 2from kivy.uix.carousel import Carousel 3from kivy.uix.boxlayout import BoxLayout 4from kivy.properties import ObjectProperty 5from kivy.graphics.texture import Texture 6from kivy.uix.image import Image as Img 7import zipfile 8import io 9from PIL import Image 10 11import time 12 13 14class Cartest(App): 15 def __init__(self, **kwargs): 16 super(Cartest,self).__init__(**kwargs) 17 self.title="test" 18 19class ImageCell(Carousel): 20 pass 21 22class MainDis(BoxLayout): 23 imagecell=ObjectProperty() 24 def imageload(self): 25 self.imagecell.clear_widgets() 26 ziplist=zipfile.ZipFile("画像の複数枚入ったzipfile") 27 ziplist=zipone.namelist() 28 imagecount=0 29 for i in ziplist: 30 time.sleep(3) 31 img=zipone.open(i) 32 img=io.BytesIO(img.read()) 33 img=Image.open(img) 34 img=img.convert("RGB") 35 texture=Texture.create(size=img.size) 36 texture.blit_buffer(img.tobytes()) 37 texture.flip_vertical() 38 self.imagecell.add_widget(Img(texture=texture,allow_stretch=True)) 39 imagecount+=1 40 print(imagecount) 41 42 43if __name__=="__main__": 44 Cartest().run()
kvファイル
cartest
1<ImageCell> 2<MainDis> 3 imagecell: imagecell 4 BoxLayout: 5 orientation:"vertical" 6 ImageCell: 7 id: imagecell 8 size_hint_y:.9 9 Button: 10 text: "test" 11 size_hint_y:.1 12 on_press: root.imageload() 13MainDis
このコードでは便宜上、画像読み込み時に3秒待っています。一枚目を読み込んだ後、2枚目の待ち時間にすでに一枚目を見れるようにしたいです。
調べた限りでは非同期処理の勉強をすべきかと思ったのですが、もしスマートに達成できそうな方法があれば教えていただきたいです。
回答1件
あなたの回答
tips
プレビュー