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

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

ただいまの
回答率

90.50%

  • Python

    11768questions

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

  • Python 3.x

    9857questions

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

  • MacOS(OSX)

    2360questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,699

part34

score 116

環境:
kivy ver1.9.0
python 3.5.2

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

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

# This Python file uses the following encoding: utf-8
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.config import Config
from kivy.uix.screenmanager import ScreenManager, Screen

Config.set('graphics', 'width', '700')
Config.set('graphics', 'height', '500')

class MenuScreen(Screen):
    pass

class Entrance(Screen):
    aaa = 'Go to main menu'
    pass
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(Entrance(name='entrance'))

class TtyApp(App):
    def build(self):
        self.title = 'Tty'
        self.icon = 'icon.png'
        return Entrance()

if __name__ == '__main__':
    TtyApp().run()
#:kivy 1.0.9

<MenuScreen>:
    AnchorLayout:
        Button:
            text: 'exit'


<Entrance>:
    Label:
        id: title
        text: "Welcome to V0ice Line"
        center_x: root.width / 2
        center_y: root.height / 2
        font_size: 50
    Image:
        source: 'icon.png'
        size: 300, 300
        pos: 200, 240
    Button:
        text: root.aaa
        pos: 100, 100
        width: 10
        on_press: root.manager.current = 'menu'

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

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

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

Traceback (most recent call last):
   File "Tty.py", line 27, in <module>
     TtyApp().run()
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/app.py", line 828, in run
     runTouchApp()
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/base.py", line 487, in runTouchApp
     EventLoop.window.mainloop()
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/core/window/window_sdl2.py", line 619, in mainloop
     self._mainloop()
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/core/window/window_sdl2.py", line 362, in _mainloop
     EventLoop.idle()
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/base.py", line 330, in idle
     self.dispatch_input()
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/base.py", line 315, in dispatch_input
     post_dispatch_input(*pop(0))
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/base.py", line 221, in post_dispatch_input
     listener.dispatch('on_motion', etype, me)
   File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699)
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/core/window/__init__.py", line 1030, in on_motion
     self.dispatch('on_touch_down', me)
   File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699)
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/core/window/__init__.py", line 1046, in on_touch_down
     if w.dispatch('on_touch_down', touch):
   File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699)
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/uix/relativelayout.py", line 278, in on_touch_down
     ret = super(RelativeLayout, self).on_touch_down(touch)
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/uix/widget.py", line 432, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699)
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/uix/behaviors/button.py", line 110, in on_touch_down
     self.dispatch('on_press')
   File "kivy/_event.pyx", line 714, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7654)
   File "kivy/_event.pyx", line 1224, in kivy._event.EventObservers.dispatch (kivy/_event.c:13497)
   File "kivy/_event.pyx", line 1108, in kivy._event.EventObservers._dispatch (kivy/_event.c:12329)
   File "/Applications/Kivy.app/Contents/Resources/kivy/kivy/lang.py", line 1557, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "./tty.kv", line 24, in <module>
     on_press: root.manager.current = 'menu'
 AttributeError: 'NoneType' object has no attribute 'current'

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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

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

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

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

sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(Entrance(name='entrance'))

class TtyApp(App):
    def build(self):
        self.title = 'Tty'
        self.icon = 'icon.png'
        return sm

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/01 12:54

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

    キャンセル

  • 2016/12/01 19:28

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

    キャンセル

0

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

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/01 12:10 編集

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

    キャンセル

同じタグがついた質問を見る

  • Python

    11768questions

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

  • Python 3.x

    9857questions

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

  • MacOS(OSX)

    2360questions

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