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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

4回答

2231閲覧

Python Kivy | Screen内のidが取得できない

EdwardRichtofen

総合スコア32

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2017/09/13 15:28

編集2017/09/13 15:42

Kivyについてですが、タイトル通りの状態が続いています。
単純にkivyファイルにてidを設定後、クラスのルート位置にid名を設定し
pythonファイルで受け取れるようにしたのですが、やはりidが取得できません。

一応id以外の問題かなと確認をしてみたら、KivyファイルにてScreenManagerに設定されているScreenについてはidが取得できないことがわかりました。

海外サイトなどでもこの現象について検索してみましたが、バグの線が非常に高く、提供元の改善を待つしかないようなのだそうです。

念のためコードを張ります。

もし解決策がお分かりの方がいましたら
教えてください。

python

1 2from kivy.app import App 3from kivy.uix.screenmanager import ScreenManager, Screen 4from kivy.uix.boxlayout import BoxLayout 5 6 7kv = """ 8Root: 9 LoginScreen: 10 SignUpScreen: 11 PassScreen: 12 Search: 13 14<test>: 15 rv: rv 16 RecycleView: 17 id: rv 18 scroll_type: ['bars', 'content'] 19 scroll_wheel_distance: dp(114) 20 bar_width: dp(10) 21 viewclass: 'Row' 22 RecycleBoxLayout: 23 default_size: None, dp(56) 24 default_size_hint: 1, None 25 size_hint_y: None 26 height: self.minimum_height 27 orientation: 'vertical' 28 spacing: dp(2) 29 30 31""" 32Builder.load_string(kv) 33 34class Test(Screen): 35 def __init__(self, **kwargs): 36 super(Search, self).__init__(**kwargs) 37 self.rv.data.insert(2, {'value': '????'}) 38 39class Root(ScreenManager): 40 pass 41 42class MyApp(App): 43 def build(self): 44 return RootFile 45 46 47if __name__ == '__main__': 48 MyApp().run()

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

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

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

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

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

guest

回答4

0

Screen内のidが取れるかどうかという話ですが結論から言うと取れます。

ただ、他の方も指摘されている通り今のコードだとそもそも起動しないかと思います。
なのでそちらのコードを修正して動くようにしてみました。
ただし「RecycleView」は修正が面倒だったのではずしました。

以下のコードを実行して、画面をクリックするとスライドが切り替わります。
最後のスライドで「TEST」というボタンと「TEST2」というところで、「TEST」ボタンを押すとラベルが「change」に変わるかと思います。

MyAppクラスのchange_labelメソッドを見てください。そこでidを取得してますのでご参考にしてください。

なおmanzyunさんが指摘されている
「self.root.get_screen('main').ids」
だとidsからたどるのは難しいです。
詳しい説明は省きますがget_screen()で取得できるのはwidgetの要素でこれだと、Widgetのサイズとかは取得できますが、idsからは辿れません。

Kvの書き方に関してはgottadiveintopyさんの質問が的確ですのでそちらを参考にしてみてください。

python3

1from kivy.app import App 2from kivy.uix.screenmanager import ScreenManager, Screen 3from kivy.lang import Builder 4#from kivy.uix.boxlayout import BoxLayout 5 6kv = """ 7Root: 8 test: 9 LoginScreen: 10 name: "Login_screen" 11 Button: 12 text: 'Goto SignUpScreen' 13 on_press: app.root.current = 'SignUp_screen' 14 15 SignUpScreen: 16 name: "SignUp_screen" 17 Button: 18 text: 'Goto SignUpScreen' 19 on_press: app.root.current = 'Pass_screen' 20 21 PassScreen: 22 name: "Pass_screen" 23 Button: 24 text: 'Goto Search' 25 on_press: app.root.current = 'Search_screen' 26 27 Search: 28 name: "Search_screen" 29 Button: 30 text: 'Goto SignUpScreen' 31 on_press: app.root.current = 'Result_screen' 32 33 Result: 34 name: "Result_screen" 35 id: result 36 Test: 37 id: result_x 38 39<Test>: 40 BoxLayout: 41 orientation: 'vertical' 42 Button: 43 text: ' TEST' 44 #on_press: root.click_tests() 45 on_press: app.change_label() 46 Label: 47 id: test2 48 text: ' TEST2' 49""" 50#Builder.load_string(kv) 51 52class Root(ScreenManager): 53 pass 54 55class LoginScreen(Screen): 56 pass 57 58class SignUpScreen(Screen): 59 pass 60 61class PassScreen(Screen): 62 pass 63 64class Search(Screen): 65 pass 66 67class Result(Screen): 68 def __init__(self, **kwargs): 69 super(Result, self).__init__(**kwargs) 70 71 72class Test(Screen): 73 pass 74 75 76class MyApp(App): 77 def build(self): 78 return Builder.load_string(kv) 79 80 def change_label(self): 81 self.root.ids['result_x'].ids['test2'].text = 'change' 82 83if __name__ == '__main__': 84 MyApp().run()

投稿2017/09/14 15:28

dario_okazaki

総合スコア282

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

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

0

ベストアンサー

絶対に動かない理由ですが、その前にKvLanguageのclass ruleとroot ruleの違いを説明させて下さい。

まずclass rule("<クラス名>:"で始まるもの)は

  • 型の定義であり、そこに書いた物はその型のインスタンス全てに影響を与えます(厳密には少し違いますが)。
  • そしてclass ruleを書いただけではインスタンスは作られません

それに対してroot rule("クラス名:"で始まるもの)は

  • 書いただけでインスタンスが一つ作られ、それがBuilder.load_string()の戻り値になります。
  • そしてroot ruleに書いた様々な定義はそのインスタンスのみの物で、他のインスタンスには影響を与えません。

上のコードにはRootクラスのroot ruleがある為、

python

1Builder.load_string(kv)

の行でKivyはRootクラスのインスタンスを作ろうとします。でも失敗します。何故ならRootの基底クラスが分からないからです。原因は

python

1class Root(ScreenManager): 2 pass

をBuilder.load_string()の前に書いてないからで、そうしてあげればインスタンス化に成功します。

ただまだ問題があって、それはBuilder.load_string(kv)の戻り値を誰も受け取ってない事です。このままだとRootのインスタンスは作ってすぐ捨てている事になるので、

python

1class MyApp(App): 2 def build(self): 3 return Builder.load_string(kv)

としてあげてください。そうすれば名前の通りRootのWidgetになります。

最後にですがTestクラスの基本クラスがScreenなのなら、おそらく

Root: LoginScreen: SignUpScreen: PassScreen: Search: Test: <Test>: 略

と、Root(ScreenManager)の子にしてやるのが希望の状態じゃないかと思います。

class ruleとroot ruleに関しては混乱すると思いますが、頑張ってください。また私はそれに関する記事も書いているので良かったら参考にしてください。

投稿2017/09/14 11:42

gottadiveintopy

総合スコア736

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

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

EdwardRichtofen

2017/09/15 03:11

回答ありがとうございました。 かなり詳しく記載していただきまして、大変参考になりました。
guest

0

idの取得云々の前にウィンドウがそもそも表示されていますか?
上のコードはかなりメチャクチャで、例え"RootFile"や"<test>"などのタイプミスを直した上で
LoginScreen:
SignUpScreen:
PassScreen:
Search:
など定義の確認できないWidget類を消したとしても、絶対に動かないコードになっています。

投稿2017/09/14 09:27

gottadiveintopy

総合スコア736

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

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

0

Referencing ids within screenmanager object - Stackoverflow
を読む限りだと、 get_screen('スクリーン名').ids という命令がありますので、ScreenManagerで名前を付けてやればいいのではないかと想像しました。

python

1kv = """ 2Root: 3 LoginScreen: 4 name: 'login' 5 SignUpScreen: 6 name: 'sign_up' 7 PassScreen: 8 name: 'pass' 9 Search: 10 namd: 'seach' 11 12""" 13 14### 中略 ### 15 16def on_start(self): 17 print(self.root.get_screen('main').ids)

とかでコンソール画面に何か表示されないでしょうか。

ぼやっとした回答で申し訳ありません。

投稿2017/09/14 01:08

manzyun

総合スコア2244

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問