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

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

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

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

Python

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

Q&A

解決済

1回答

2269閲覧

kivy: 他ウィジェットの要素を参照するには

退会済みユーザー

退会済みユーザー

総合スコア0

Kivy

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

Python

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

0グッド

0クリップ

投稿2020/11/08 07:23

下のようなコードがあるとして、

python3

1from kivy.app import App 2from kivy.uix.boxlayout import BoxLayout 3from kivy.uix.label import Label 4 5class Myapp(App): 6 pass 7 8if __name__ == '__main__': 9 Myapp().run()

kivy

1#:kivy 1.9.0 2 3RootWidget: 4 5<RootWidget@BoxLayout>: 6 BoxLayout: 7 Mybox_1: 8 Mybox_2: 9 10 11<Mybox_1@BoxLayout>: 12 Label: 13 text: 'apple' 14 Button: 15 text: 'button_1' 16 17<Mybox_2@BoxLayout>: 18 Label: 19 text: 'banana' 20 Button: 21 text: 'button_2'

button_1のボタンに「押すと、Mybox_2にあるテキストを読み取って、Mybox_1にあるテキストをそれで書き換える」操作を割り当てたい場合どうすればよいでしょうか。

ボタンになにか関数を割り当てるのはon_pressで出来る、というところまでは出来たのですが、あるウィジェットから他ウィジェットの構成要素を参照する方法がわかりませんでした。

idsを使えばいいと思ったのですがうまく取り扱えず。。。
どなたかご教授いただきたいです。

あと、kivyの学習に使える書籍など何かおすすめはないでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードには1つのroot ruleと3つのclass ruleがありますが、本当に三つもclass ruleが要るかどうか考えてください。(root ruleclass ruleやらが何であるかはこれを参考に)。少なくともMybox_1Mybox_2は持っている値が異なるだけの同じ型に見えます。

classをたくさん用意する明確な理由が無いのならとりあえず今回の場合はclass ruleは一つだけ(<RootWidget>:)で作るのがお薦めですね。もし理由があるのならそれを追記してほしいです。

書籍に関しては私はほとんどネット上の情報で学んだので詳しくないですが、一つお薦めじゃない物を挙げるとするならこれになりますね。理由は前半がほとんどkivyじゃなくてpythonの解説になってるからです。okazakiさんという人は色んなkivy本を買って読んでいるので訊いてみるのはありだと思います。あとkivyに関する記事も書かれているので参考になるかもしれません。原口和也さんという人の書かれたこのPDFもお薦めですね。

追記(widgetにidを割り当ててそれを辿るやり方)

yaml

1RootWidget: 2 3<RootWidget@BoxLayout>: 4 on_kv_post: 5 mybox1.ids.button.bind(on_press=lambda __: setattr(mybox1.ids.label, 'text', mybox2.ids.label.text)) 6 BoxLayout: 7 Mybox_1: 8 id: mybox1 9 Mybox_2: 10 id: mybox2 11 12 13<Mybox_1@BoxLayout>: 14 Label: 15 id: label 16 text: 'apple' 17 Button: 18 id: button 19 text: 'button_1' 20 21<Mybox_2@BoxLayout>: 22 Label: 23 id: label 24 text: 'banana' 25 Button: 26 text: 'button_2'

投稿2020/11/09 09:56

編集2020/11/10 14:28
gottadiveintopy

総合スコア736

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

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

退会済みユーザー

退会済みユーザー

2020/11/09 15:36

回答ありがとうございます。 質問のコードは本来はもっと長いコードでして、質問のために簡略化しようとした結果そうなってしまいました。聞きたい内容を尋ねるならこれでいいだろう、と・・・。 書籍の紹介もありがとうございます。読んでみます。
gottadiveintopy

2020/11/10 16:08 編集

idを割り当てるやり方を追記しました。ただこんな風に他のrule内の子widgetにアクセスしている状態は、ruleの粒度が正しくない可能性があるので気をつけて下さい。(感覚としては他のclassのprivate変数にアクセスしているのに近いです)。
退会済みユーザー

退会済みユーザー

2020/11/10 15:11

ありがとうございます。設計から考え直してみることにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問