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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3434閲覧

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

nagi900

総合スコア7

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/05 21:57

編集2021/04/13 10:39

##概要
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を編集し続けるものです。
詳細はこちらです

python

1from kivy.config import Config 2from kivy.app import App 3from kivy.uix.widget import Widget 4from kivy.uix.image import Image 5from kivy.properties import StringProperty ,ObjectProperty 6from kivy.core.text import LabelBase,DEFAULT_FONT 7from kivy.resources import resource_add_path 8from kivy.clock import Clock 9from kivy.graphics.texture import Texture 10from kivy.graphics import Rectangle 11 12import os 13import glob 14import random 15import threading 16import time 17 18import handtracking 19 20 21class SmartGlassWidget(Widget): 22 image_L_src = StringProperty("") 23 image_R_src = StringProperty("") 24 25 def __init__(self, **kwargs): 26 super(SmartGlassWidget,self).__init__(**kwargs) 27 self.image_L_src = "./Image_layer/ImgLeft_0.png" 28 self.image_R_src = "./Image_layer/ImgRight_0.png" 29 30 self.image_L = Image(source=self.image_L_src) 31 self.image_R = Image(source=self.image_R_src) 32 self.handtrackingApp=handtracking.Handtracking() 33 pass 34 35 def update(self,dt): 36 print("更新") 37 self.handtrackingApp.run() 38 self.image_L.reload() 39 40 def StartbuttonClicked(self): 41 Clock.schedule_interval(self.update,0.01) 42 pass 43 44class SmartGlassApp(App): 45 def __init__(self,**kwargs): 46 super(SmartGlassApp,self).__init__(**kwargs) 47 self.title = "SmartGlass" 48 49 def build(self): 50 return SmartGlassWidget() 51 52if __name__ == "__main__": 53 SmartGlassApp().run()

kv

1SmartGlassWidget: 2 3<SmartGlassWidget>: 4 BoxLayout: 5 orientation: "vertical" 6 size: root.size 7 BoxLayout: 8 Image: 9 source: root.image_L_src 10 Image: 11 source: root.image_R_src 12 13 Button: 14 size_hint_y:0.2 15 text:"Start App" 16 color: 1,0.5,0,1 17 on_press: root.StartbuttonClicked()

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

kv

1Image: 2   source: root.image_L_src

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

追記:気づいた問題点

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

python

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

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

kv

1<SmartGlassWidget>: 2 BoxLayout: 3 BoxLayout: 4 Image: 5 source: root.image_L_src 6 Image: 7 source: root.image_R_src

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

kv

1<SmartGlassWidget>: 2 BoxLayout: 3 BoxLayout: 4 Image: 5 id: image_L 6 source: root.image_L_src 7 Image: 8 id: image_R 9 source: root.image_R_src

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

python

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

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

python

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

は消してください。

投稿2021/04/11 05:17

編集2021/04/13 12:44
gottadiveintopy

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagi900

2021/04/12 01:11

質問方法のアドバイスをしてくださりありがとうございます。 取り急ぎhandtrackingのコードへのリンクを追記し、可能な範囲で不必要な部分は削除させていただきました。 今日中に最小限のコードに編集いたします。
gottadiveintopy

2021/04/12 10:44

update()が0.01秒毎に呼ばれるようにschedulingしているという事はself.handtrackingApp.run()を0.01秒毎に呼びたいという事になんですよね?だとするとself.handtrackingApp.run()はカメラから一度だけ画像を取り込んで一度だけファイルに書き込むという機能になると思うのですが、実装コードを読んだ感じwhile loopを用いて何度も取り込み/書き込みを行っているように思えます。その辺は間違ってないですが? あと "更新" がちゃんと大量に出力されていますか?
nagi900

2021/04/13 10:22

可読性の低いコードで申し訳ありません... handtracking.pyのWhile文は他の関数から呼び出された時は繰り返さないようになっています。 "更新"は正しく大量に出力され続けています。
nagi900

2021/04/13 12:53

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

2021/04/13 12:55

追記しました。実際に動作確認したわけじゃないので他にも問題は残っているかもしれないですが、camera繋いで動作確認するのはしんどいのでそこら辺は許してください。 ".kvファイル側でその画像をどう指定すればよいのかわかりません" 後、Kv側での指定の仕方は現在のやり方で合っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問