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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

Q&A

解決済

2回答

7140閲覧

kivyの画面遷移の方法がわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

0グッド

2クリップ

投稿2016/11/30 17:34

編集2016/12/01 03:02

環境:
kivy ver1.9.0
python 3.5.2

本題
kivyを始めたばかりなのですが、画面遷移の方法がわかりません。

ScreenManager
ここのBasic Usageを見ながら見よう見まねで書いたんですが、うまく動きません。原因を教えていただきたいです。

Python

1# This Python file uses the following encoding: utf-8 2from kivy.app import App 3from kivy.uix.widget import Widget 4from kivy.config import Config 5from kivy.uix.screenmanager import ScreenManager, Screen 6 7Config.set('graphics', 'width', '700') 8Config.set('graphics', 'height', '500') 9 10class MenuScreen(Screen): 11 pass 12 13class Entrance(Screen): 14 aaa = 'Go to main menu' 15 pass 16sm = ScreenManager() 17sm.add_widget(MenuScreen(name='menu')) 18sm.add_widget(Entrance(name='entrance')) 19 20class TtyApp(App): 21 def build(self): 22 self.title = 'Tty' 23 self.icon = 'icon.png' 24 return Entrance() 25 26if __name__ == '__main__': 27 TtyApp().run()

KivyLang

1#:kivy 1.0.9 2 3<MenuScreen>: 4 AnchorLayout: 5 Button: 6 text: 'exit' 7 8 9<Entrance>: 10 Label: 11 id: title 12 text: "Welcome to V0ice Line" 13 center_x: root.width / 2 14 center_y: root.height / 2 15 font_size: 50 16 Image: 17 source: 'icon.png' 18 size: 300, 300 19 pos: 200, 240 20 Button: 21 text: root.aaa 22 pos: 100, 100 23 width: 10 24 on_press: root.manager.current = 'menu'

上がTty.pyファイル、下がTty.kvファイルです。

余談ですが、これを実行すると、なぜかButtonに設定してあるWidthの数値に反して、画面いっぱいの大きさのボタンが表示されます。(EntranceクラスがScreenを継承するとこうなります。Widgetだとなりません。)この理由も知りたいです。

**さて本題。**公式リファレンスでは、表示されたボタンを押すと、切り替わると書いてあるのですが、実際に押すと以下のエラー文が出ます。

Error

1 Traceback (most recent call last): 2 File "Tty.py", line 27, in <module> 3 TtyApp().run() 4 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/app.py", line 828, in run 5 runTouchApp() 6 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/base.py", line 487, in runTouchApp 7 EventLoop.window.mainloop() 8 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/core/window/window_sdl2.py", line 619, in mainloop 9 self._mainloop() 10 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/core/window/window_sdl2.py", line 362, in _mainloop 11 EventLoop.idle() 12 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/base.py", line 330, in idle 13 self.dispatch_input() 14 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/base.py", line 315, in dispatch_input 15 post_dispatch_input(*pop(0)) 16 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/base.py", line 221, in post_dispatch_input 17 listener.dispatch('on_motion', etype, me) 18 File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699) 19 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/core/window/__init__.py", line 1030, in on_motion 20 self.dispatch('on_touch_down', me) 21 File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699) 22 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/core/window/__init__.py", line 1046, in on_touch_down 23 if w.dispatch('on_touch_down', touch): 24 File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699) 25 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/uix/relativelayout.py", line 278, in on_touch_down 26 ret = super(RelativeLayout, self).on_touch_down(touch) 27 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/uix/widget.py", line 432, in on_touch_down 28 if child.dispatch('on_touch_down', touch): 29 File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699) 30 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/uix/behaviors/button.py", line 110, in on_touch_down 31 self.dispatch('on_press') 32 File "kivy/_event.pyx", line 714, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7654) 33 File "kivy/_event.pyx", line 1224, in kivy._event.EventObservers.dispatch (kivy/_event.c:13497) 34 File "kivy/_event.pyx", line 1108, in kivy._event.EventObservers._dispatch (kivy/_event.c:12329) 35 File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/lang.py", line 1557, in custom_callback 36 exec(__kvlang__.co_value, idmap) 37 File "./tty.kv", line 24, in <module> 38 on_press: root.manager.current = 'menu' 39 AttributeError: 'NoneType' object has no attribute 'current'

NoneTypeとはなんの話なのかわかりません!
僕は、最終的にEntrance画面からMainScreenに、フェードアウト、フェードインで遷移するようにしたいです
どうすればいいのか教えていただけると幸いです。。。
(ボタンなどの配置が、Widgetを継承した時とScreenを継承した時で変わる理由もご存知であればご教授いただきたい)

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラーの箇所に出ている通り、kvファイル側に定義されているEntranceにあるroot.managerNoneなのが原因です。

ScreenManagerScreenは結びついて動いており、ScreenManagerのインスタンスにadd_widgetで登録した際に、初めて`manager`として有効になります。

そのためXxxAppbuild()実行時にはScreen単体ではなく必要なScreenが全て登録されているScreenManagerを返してあげる必要があります。

今回のケースではTty.pyの途中で作成したScreenManagerのインスタンスが使われていないので、そちらを返す必要があります。

python

1sm = ScreenManager() 2sm.add_widget(MenuScreen(name='menu')) 3sm.add_widget(Entrance(name='entrance')) 4 5class TtyApp(App): 6 def build(self): 7 self.title = 'Tty' 8 self.icon = 'icon.png' 9 return sm

...というのがドキュメントと自分の記憶をもとにした回答なのですが、
手元で確認したらbuild内でScreenManagerを生成しないと動かない現象が起きました。

もし上のコードで動かなければ、下のコードも試してみてください。

python

1class TtyApp(App): 2 def build(self): 3 self.title = 'Tty' 4 self.icon = 'icon.png' 5 # ScreenManagerのインスタンスもbuild()内で生成 6 sm = ScreenManager() 7 sm.add_widget(Entrance(name='entrance')) 8 sm.add_widget(MenuScreen(name='menu')) 9 return sm

投稿2016/12/01 03:33

attakei

総合スコア2738

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

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

退会済みユーザー

退会済みユーザー

2016/12/01 03:54

とても説得力のあるご回答ありがとうございます。帰宅してから、改めて実行、確認をさせていただきます!kivyに詳しい知り合いがいないため、とても助かります。。
退会済みユーザー

退会済みユーザー

2016/12/01 10:28

下のコードで、うまく遷移させることができました!!! ありがとうございました
guest

0

kvファイルのビルドを行っていないためにNoneTypeがでているのではないかと推測します。
Tty.pyファイルの5行目の後ろに以下を追加してみていかがでしょうか。

python

1from kivy.lang import Builder 2Builder.load_file("Tty.ky") 3### 以下省略 ###

BasicUsageのソースを斜め読みして、リファレンスをたどると「kivy.lang.builder」の中に「load_file」というメソッドがあったのでこういった推測になりました。


参考資料: kivy.lang.builder.load_file

投稿2016/11/30 23:11

manzyun

総合スコア2244

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

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

退会済みユーザー

退会済みユーザー

2016/12/01 10:13 編集

すみません! Appを継承していたクラス名をTtyAppに変更しました!(質問用にコードを書き換えた際にミスがあったようです。ビルドの問題ではないかと思います。) おそらくこれでビルドの問題は無くなります。申し訳ありませんでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問