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

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

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

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

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

Python

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

Q&A

解決済

1回答

3655閲覧

kivy:ドラッグ&ドロップでファイルパスを表示

Totto2064

総合スコア6

Kivy

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

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

Python

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

0グッド

0クリップ

投稿2020/04/13 02:52

kivyを使って、ドラッグ&ドロップしたファイルをLabelで表示させたい

下の様なプログラムを作ったのですが、pythonからkv言語のidを参照するとMyRoot().ids["lbl"].textの行にエラーがでます。
Printの方ではパスが表示されています。
初心者質問で申し訳ないですが、idの使い方について何が問題なのか教えていただけますでしょうか。

発生している問題・エラーメッセージ

MyRoot().ids["lbl"].text = file_path KeyError: "lbl"

該当のソースコード

python

1from kivy.app import App 2from kivy.uix.label import Label 3from kivy.uix.boxlayout import BoxLayout 4from kivy.core.window import Window 5 6 7class MyRoot(BoxLayout): 8 pass 9 10class TestApp(App): 11 def build(self): 12 Window.bind(on_dropfile=self._on_file_drop) 13 return 14 15 def _on_file_drop(self, window, file_path): 16 print(file_path.decode("UTF-8")) 17 MyRoot().ids["lbl"].text = file_path 18 return 19 20TestApp().run() 21

kv

1MyRoot: 2 Label: 3 id:lbl 4 text:"File path is:" 5

補足情報(FW/ツールのバージョンなど)

使用しているのは
Python 3.7.7
Kivy 1.11.1
です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

build()で明示的に生成しなかった場合、
アプリケーションの root 属性で MyRootのインスタンスにアクセスできます。

python

1class TestApp(App): 2 def build(self): 3 Window.bind(on_dropfile=self._on_file_drop) 4 return 5 6 def _on_file_drop(self, window, file_path): 7 self.root.ids["lbl"].text = "File path is: " + file_path.decode("utf-8")

但し、これでは "File path is: " を KVファイルと同じ内容を2度書くことになるので、
_on_file_dropでは直接ラベルを参照せずに、
StringPropertyを用いてプロパティ変更で通知する方が良いです。

from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.core.window import Window from kivy.properties import StringProperty class MyRoot(BoxLayout): file_path = StringProperty("") class TestApp(App): def build(self): Window.bind(on_dropfile=self._on_file_drop) def _on_file_drop(self, window, file_path): self.root.file_path = file_path.decode("utf-8") TestApp().run()

MyRootにプロパティを持たせることにします。
Labelから見ると親要素のプロパティなので、parentを参照する。(追記 root.file_pathでも良い)

kv

1MyRoot: 2 Label: 3 id: lbl 4 text:"File path is: " + self.parent.file_path

追記: エラーの原因

# _on_file_drop 内で MyRoot() を生成していますが、 MyRoot().ids["lbl"].text = file_path # ここで生成されるクラスは、以下の空の MyRoot クラスで、 # ラベル等の情報を持ちません。 class MyRoot(BoxLayout): pass # build() が何も返さなかった場合、kivy は kvファイルからウィジェットを生成し # root属性に設定します。

投稿2020/04/13 05:12

編集2020/04/13 07:01
teamikl

総合スコア8664

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

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

teamikl

2020/04/13 05:16

後から気が付きました、私の手元の環境は kivy 2.0.0rcでした。 動作確認はしましたが、バージョン間の違いはあるかもしれません。
Totto2064

2020/04/13 08:09

回答いただきありがとうございます。 追加で質問なのですが、pythonの_on_file_dropの中で記述しているself.root.filepathについて、selfとrootはそれぞれTestAppとMyRootを参照していると考えていいのでしょうか。 理解が浅く申し訳ないですがよろしお願いします。
teamikl

2020/04/13 09:00 編集

self は、Pythonのクラス共通の事項で、慣習的に self という名前ですが、 メソッドの引数の1番目に自分自身(インスタンス)が入ります。 TestApp 内の self は、そのクラスのインスタンスなので、その通りですが、 kv ファイルの Label 内の self は、Labelのインスタンスになる点は注意です。 >TestAppとMyRootを参照している 厳密には、それぞれ TestAppとMyRoot の「インスタンス」を指していると言えます。 ここで "TestApp" という場合はクラス自体を指す事になるので、インスタンスとは区別されます。 ここまで説明で「インスタンス」という用語を多用してしまいましたが、 このクラスとインスタンスの違いの理解が重要なポイントです。 「クラス(型)」「インスタンス(実際の値)」とイメージすると解りやすいかもしれません。 root は、アプリケーションのインスタンスに対し kivy が自動的に設定する属性です。 .kv ファイル側でも同様に、`self`, `root`, `app` が参照できます。
Totto2064

2020/04/13 13:39

なるほど。大変勉強になります。 実際にうまく動作しました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問