質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

Image(source="")で作成した画像を、kvファイル側で指定する方法を教えていただきたいです。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 564

score 7

概要

kivyで二枚の画像をリロードし続けるプログラムを書いています。
アプリの画像

python側でself.image_L = Image(source=self.image_L_src)として作成した画像を、self.image_L.reload()でリロードできるということは理解できたのですが、.kvファイル側でその画像をどう指定すればよいのかわかりません。指定方法についてご教示願えないでしょうか。
.kvファイルを使用せず.pyファイルのみでGUIを作成する方法でも、上の画像の通りの配置で更新し続けることができるのであれば、それでも大丈夫です。

現在のコード

handtrackingは、カメラ映像をもとに./Image_layer/ImgRight_0.pngを編集し続けるものです。
詳細はこちらです

from kivy.config import Config
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.image import Image
from kivy.properties import StringProperty ,ObjectProperty
from kivy.core.text import LabelBase,DEFAULT_FONT
from kivy.resources import resource_add_path 
from kivy.clock import Clock 
from kivy.graphics.texture import Texture
from kivy.graphics import Rectangle

import os
import glob
import random
import threading
import time

import handtracking


class SmartGlassWidget(Widget):
    image_L_src = StringProperty("")
    image_R_src = StringProperty("")

    def __init__(self, **kwargs):
        super(SmartGlassWidget,self).__init__(**kwargs)
        self.image_L_src = "./Image_layer/ImgLeft_0.png"
        self.image_R_src = "./Image_layer/ImgRight_0.png"

        self.image_L = Image(source=self.image_L_src)
        self.image_R = Image(source=self.image_R_src)
        self.handtrackingApp=handtracking.Handtracking()
        pass

    def update(self,dt):
        print("更新")
        self.handtrackingApp.run()
        self.image_L.reload()

    def StartbuttonClicked(self):
        Clock.schedule_interval(self.update,0.01)
        pass

class SmartGlassApp(App):
    def __init__(self,**kwargs):
        super(SmartGlassApp,self).__init__(**kwargs)
        self.title = "SmartGlass"

    def build(self):
        return SmartGlassWidget()

if __name__ == "__main__":
    SmartGlassApp().run()
SmartGlassWidget:

<SmartGlassWidget>:
    BoxLayout:
        orientation: "vertical"
        size: root.size
        BoxLayout:
            Image:
                source: root.image_L_src
            Image:
                source: root.image_R_src

        Button:
            size_hint_y:0.2
            text:"Start App"
            color: 1,0.5,0,1
            on_press: root.StartbuttonClicked()

表示している画像はkvファイルで

Image:
   source: root.image_L_src


として指定したものです。
update関数でself.image_L.reload()し続けていますが、self.image_Lを表示してはいません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

handtrackingというmoduleのcodeが無いのでこっちの環境でcodeを実行することが出来ません。こういった質問サイトで訊く時は実行に必要な物を全て載せて、読んだ人が自分で動作確認できるようにしてあげたほうが良いです。それから載せるcodeはできるだけ不具合を再現できる最小限の物にして欲しいです。そうする事で読む人の負担が減るだけじゃなく、多くの場合その過程で問題の原因が分かるので。

追記:気づいた問題点

python上で作っている以下のimage_Limage_R

class SmartGlassWidget(Widget):
    def __init__(self, **kwargs):
        self.image_L = Image(source=self.image_L_src)
        self.image_R = Image(source=self.image_R_src)

Kv言語上の以下の2つのImage

<SmartGlassWidget>:
    BoxLayout:
        BoxLayout:
            Image:
                source: root.image_L_src
            Image:
                source: root.image_R_src

とは別物です。なので現在のcodeだとwidget treeに繋げていないimage、つまり画面上に表示されていないimageの.reload()を呼び続けている事になります。正しくは以下のようにKv言語上でimageにidを割り当てて

<SmartGlassWidget>:
    BoxLayout:
        BoxLayout:
            Image:
                id: image_L
                source: root.image_L_src
            Image:
                id: image_R
                source: root.image_R_src

python側から以下のようにimageを参照します。

    def update(self,dt):
        print("更新")
        self.handtrackingApp.run()
        self.ids.image_L.reload()

そしてpython側で作る必要は無いので

        self.image_L = Image(source=self.image_L_src)
        self.image_R = Image(source=self.image_R_src)

は消してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/04/13 21:53

    追記を拝見しました!指摘していただいたように直すと正しく更新されるようになりました。解決方法だけでなく質問方法のアドバイスまでして下さり、とても参考になりました。本当にありがとうございました!

    キャンセル

  • 2021/04/13 21:55

    追記しました。実際に動作確認したわけじゃないので他にも問題は残っているかもしれないですが、camera繋いで動作確認するのはしんどいのでそこら辺は許してください。

    ".kvファイル側でその画像をどう指定すればよいのかわかりません"
    後、Kv側での指定の仕方は現在のやり方で合っています。

    キャンセル

  • 2021/04/13 21:56

    いえいえ

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る