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

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

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

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

Python

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

Q&A

解決済

2回答

1991閲覧

Pythonのkivyで、MainscreenとSubscreenの変数の引き継ぎ

Danny0826

総合スコア1

Kivy

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

Python

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

0グッド

1クリップ

投稿2020/10/28 14:05

前提・実現したいこと

Pythonのkivyで、MainscreenとSubscreenの変数の引き継ぎ?について質問します。
以下のコードで、例えば、Subscreenの"input"に"ABC"と入力すると、Mainscreenの'XXX'の箇所に"ABC"と表示されるようにしたいです。

MainscreenとSubscreenの変数の引き継ぎ?をどう書けば良いのかわかりません。

どうぞおよろしくお願いします。

###ソースコード

python

1from kivy.uix.screenmanager import ScreenManager, Screen 2from kivy.app import App 3from kivy.lang.builder import Builder 4 5from kivy.config import Config 6Config.set('graphics', 'width', '640') 7Config.set('graphics', 'height', '480') 8 9 10Builder.load_string(''' 11<MainScreen>: 12 BoxLayout: 13 size: root.size 14 15 Label: 16 17 id: label1 18 font_size: 40 19 text: 'XXX' 20 21 Button: 22 id: label_syokuhin 23 font_size: 40 24 text:'next' 25 26 on_press: 27 root.manager.transition.direction='left' 28 root.manager.current = 'second' 29 30 31<SubScreen>: 32 BoxLayout: 33 orientation: 'vertical' 34 35 BoxLayout: 36 Button: 37 text: 'back' 38 font_size: 40 39 on_press: 40 root.manager.transition.direction='right' 41 root.manager.current = 'first' 42 43 TextInput: 44 id: text1 45 font_size: 40 46 47 line_height: 1 48 multiline: False 49 hint_text: 'input' 50 51''') 52 53class MainScreen(Screen): 54 pass 55 56 def __init__(self, **kwargs): 57 super(MainScreen, self).__init__(**kwargs) 58 pass 59 60 61class SubScreen(Screen): 62 pass 63 64 def __init__(self, **kwargs): 65 super(SubScreen, self).__init__(**kwargs) 66 67 68sm = ScreenManager() 69sm.add_widget(MainScreen(name= 'first')) 70sm.add_widget(SubScreen(name= 'second')) 71 72class MainApp(App): 73 def build(self): 74 return sm 75 76if __name__=='__main__': 77 MainApp().run()

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

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

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

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

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

guest

回答2

0

ベストアンサー

アプリケーションの規模が大きくなって来たら以下のようにScreen間で共有したい値を入れる為の専用のclassを用意するのもありですね。

python

1from kivy.properties import StringProperty 2from kivy.uix.screenmanager import ScreenManager, Screen 3from kivy.app import App 4from kivy.lang.builder import Builder 5from kivy.event import EventDispatcher 6 7 8Builder.load_string(''' 9<MainScreen>: 10 BoxLayout: 11 size: root.size 12 Label: 13 font_size: 40 14 text: app.shared_data.text 15 Button: 16 id: label_syokuhin 17 font_size: 40 18 text:'next' 19 on_press: 20 root.manager.transition.direction='left' 21 root.manager.current = 'second' 22 23 24<SubScreen>: 25 BoxLayout: 26 orientation: 'vertical' 27 BoxLayout: 28 Button: 29 text: 'back' 30 font_size: 40 31 on_press: 32 root.manager.transition.direction='right' 33 root.manager.current = 'first' 34 35 TextInput: 36 font_size: 40 37 line_height: 1 38 multiline: False 39 hint_text: 'input' 40 on_kv_post: self.bind(text=app.shared_data.setter('text')) 41 42''') 43 44 45class SharedData(EventDispatcher): 46 text = StringProperty() 47 48 49class MainScreen(Screen): 50 pass 51 52 53class SubScreen(Screen): 54 pass 55 56 57class MainApp(App): 58 def build(self): 59 self.shared_data = SharedData() 60 sm = ScreenManager() 61 sm.add_widget(MainScreen(name= 'first')) 62 sm.add_widget(SubScreen(name= 'second')) 63 return sm 64 65 66if __name__=='__main__': 67 MainApp().run()

投稿2020/10/31 13:49

編集2020/11/02 12:50
gottadiveintopy

総合スコア736

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

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

0

デフォルト値の扱いや反映のタイミング等についてはいろいろありそうですが、
Python で記述する場合。

pyhton

1first = sm.get_screen('first') 2second = sm.get_screen('second') 3second.ids.text1.bind(text=first.ids.label1.setter('text'))
  • スクリーンの参照 get_screen
  • ID の参照 ids
  • テキスト入力をラベルに反映 bind/setter

kv言語に直接記述する場合は、MainScreen インスタンス化の時点では
SubScreen はまだ生成されてない為、参照できない点に注意。


参考

※ 注釈「self.ids」 の使用する方法は非常に簡潔であるが、通常はObjectPropertyを使用する方が「ベストプラクティス」です。 より高速なアクセスが提供されてより明示的になります。

投稿2020/10/28 20:44

teamikl

総合スコア8664

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問