2017-11-22 47 views
0

私は楽しいことをしてkivyを学ぼうとしていますが、kivyのやり方を理解するのは難しいです。サムネイルギャラリーでクリック可能なkivyイメージを作成する方法

私はforループでサムネイルギャラリーを作成し、個々のイメージをコールバックにバインドしました。クリックしたイメージの情報(パス)をコールバックに渡してイメージを開きます。しかし、私はkivyでこのような簡単なことをする方法を理解しているように思えるので、私はいくつかの助けが必要です。

ボタンウィジェットの使用。私はボタンを使ってギャラリーを作って、その背景を画像に変更しようとしましたが、画像は伸びてゆがんでしまいました。

画像ウィジェットでサムネイルギャラリーを作ったところ、親指で見つかったばかりの画像しか表示されませんでしたが、クリックしたサム情報を各サム(コールバックイベント)のコールバックに渡す方法が見つかりませんだと思う。

私はon_touch_downプロパティで各親指を結合するが、コールバックが実行されたときに情報をワンクリック魔女にコールバックに渡されるすべての親指は、私が欲しいものではありません、私がクリックされた個々の親指の唯一の情報が欲しいですコールバックに渡されます。私はkivy docsを読んだが、ますます混乱する。ここには私の裸の骨のコードです、どんな助けもありがとうありがとうございます。

from kivy.app import App 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.image import Image 

import glob 


class Image_Gallery(GridLayout): 


    def __init__(self): 
     super(Image_Gallery, self).__init__() 
     images = glob.glob('C:\Users\Public\Pictures\Sample Pictures\*.jpg') # windows 7 sample pictures dir looks great 
     self.cols=3 
     for img in images: 
      thumb = Image(source=img) 
      thumb.bind(on_touch_down=self.callback) # I tried on_touch property but does not work with images only buttons 
      self.add_widget(thumb) 

    def callback(self, obj, touch): 
     # This should print only the clicked image source. 
     # (but instead is printing all images sources at once) 
     print obj.source     



class mainApp(App): 


    def build(self): 
     return Image_Gallery() 


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

答えて

1

on_touchイベントは、あなたのアプリ内のすべてのウィジェットにイベントをdispach、あなた自身のImageクラスを定義し、on_touch方法を再定義する必要があります。

... 
class MyImage(Image): 
    def on_touch_down(self, touch): 
     if self.collide_point(*touch.pos): 
      print self.source 

class Image_Gallery(GridLayout): 

    def __init__(self, **kwargs): 
     super(Image_Gallery, self).__init__(**kwargs) 
     images = glob.glob('C:\Users\Public\Pictures\Sample Pictures\*.jpg') 
     self.cols = 3 
     for img in images: 
      thumb = MyImage(source=img) 
      self.add_widget(thumb) 
... 
+1

偉大な応答を。 私はこのことを私に理解させてくれた(SP SP)のおかげです。どうもありがとうございます(SP SP)。 これをより明確にするためです。 "class MyImage(Image)"クラスはkivy Image()クラスになります。なぜなら、この新しく作成されたクラスにsource = 'img.jpg'を渡す理由が理解できます。 新しいカスタムクラス "self.collide_point(* touch.pos):"内の部分がフィルタになります。クリックされた画像(ウィジェット)のみをフィルタリングする部分です。 SP SP)は、すべての画像(ウィジェット)ソースが印刷されると述べた。すばらしいです –

関連する問題