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

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

ただいまの
回答率

90.53%

  • Python 2.7

    1259questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Raspberry Pi

    799questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Kivyを終了させる方法を教えてください

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 881

evil_ryu

score 12

前提・実現したいこと

PythonにKV languageを直書きしています。なので、プログラム自体の終了(Ctrl+Cなど)ではなく、Kivyで作成したアプリのみを終了させる(窓が閉じるところまで)方法を知りたいです。

試してみたこと

公式ドキュメントや質問サイト等を調べ、以下を試してみましたがダメでした。どのようにすればプログラム内でKivyを終了させることが出来るのか、どなたかご教授ください。

以下はエラーを吐くこともなく完全にスルーされてしまいました。

App.get_running_app().stop() 
 App.stop() 


以下はボタンを押下しても無反応でした

    Button:
        id: btnExit
        text: "Exit"
        on_press: app.stop

該当のソースコード

Builder.load_string("""
<MyApp>:
    Button:
        id: btn
        font_size: 68
    Button:
        id: btnExit
        text: "Exit"
        on_press: app.stop
""")

num = 0
class MyApp(App, BoxLayout):
    def build(self):
        self.ids.btn.text = 'by Python'
        global num
        num += 1
        return self


if __name__ == "__main__":
    global num
    while True:
        if num == 0:
            MyApp().run()
            num += 1
        elif num == 2:
            #ここでKivyを終了したい
            MyApp().stop()
            num+=1
        else:
            break

補足情報(言語/FW/ツール等のバージョンなど)

バージョン
Kivy 1.10.1
Python 2.7.9

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+2

似たような問題を見つけましたのでご参考にしてみてください。ラズパイはいろいろデバイス固有の問題があるようです。

https://stackoverflow.com/questions/35203141/how-to-exit-python-program-on-raspberry

→要約すると、プログラムループを事前終わらせてから、sys.exit()すると終了できるというものだそうです

https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=146737
→今回と内容がちがうかもしれませんがご参考までに

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

正しい方法かは不明ですが、on_pressを以下のように変更することでExitボタンでウインドウを閉じてwhileループに戻ることができました。

Builder.load_string("""
        # 略
        on_press: app.root_window.close()

以下検証コードです。

from kivy.lang import Builder
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout

Builder.load_string("""
<MyApp>:
    Button:
        id: btn
        font_size: 68
    Button:
        id: btnExit
        text: "Exit"
        on_press: app.root_window.close()
""")

class MyApp(App, BoxLayout):
    def build(self):
        self.ids.btn.text = 'by Python'
        return self

if __name__ == "__main__":
    bApp = False
    while True:
        if bApp is False:
            MyApp().run()
            bApp = True
        else:
            if input('input 9 to exit:') == 9:
                break

実行結果。Win10x64上。

>python hoge.py
[INFO   ] [Logger      ] Record log in C:\Users\user\.kivy\logs\kivy_17-11-17_29.txt
[INFO   ] [Kivy        ] v1.10.0
[INFO   ] [Python      ] v2.7.14 |Anaconda custom (64-bit)| (default, Nov  8 2017, 13:40:45) [MSC v.1500 64 bit (AMD64)]
[INFO   ] [Factory     ] 194 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO   ] [OSC         ] using <thread> for socket
[INFO   ] [Window      ] Provider: sdl2
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] GLEW initialization succeeded
[INFO   ] [GL          ] Backend used <glew>
[INFO   ] [GL          ] OpenGL version <4.0.0 - Build 10.18.10.4425>
[INFO   ] [GL          ] OpenGL vendor <Intel>
[INFO   ] [GL          ] OpenGL renderer <Intel(R) HD Graphics 4000>
[INFO   ] [GL          ] OpenGL parsed version: 4, 0
[INFO   ] [GL          ] Shading version <4.00 - Build 10.18.10.4425>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <16>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [Base        ] Start application main loop
[INFO   ] [GL          ] NPOT texture support is available
[ERROR  ] [Base        ] No event listeners have been created
[ERROR  ] [Base        ] Application will leave
input 9 to exit:1
input 9 to exit:9
>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/17 18:34 編集

    ありがとうございます。検証コードを試したところ、確かにボタンを押下したところウインドウも閉じることができました。しかし、whileループに戻ることが出来ず、

    ```

    [INFO ] [Base ] Leaving application in progress...
    Traceback (most recent call last):
    File "kivy_test.py", line 27, in <module>
    MyApp().run()
    File "/usr/local/lib/python2.7/dist-packages/kivy/app.py", line 829, in run
    runTouchApp()
    File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 502, in runTouchApp
    EventLoop.window.mainloop()
    File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", line 92, in mainloop
    self._mainloop()
    File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", line 87, in _mainloop
    EventLoop.idle()
    File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 354, in idle
    window.dispatch('on_flip')
    File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch (/tmp/pip-0Hs1f_-build/kivy/_event.c:7726)
    File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/__init__.py", line 1222, in on_flip
    self.flip()
    File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", line 84, in flip
    egl.SwapBuffers(self.egl_info[0], self.egl_info[1])
    File "kivy/lib/vidcore_lite/egl.pyx", line 596, in kivy.lib.vidcore_lite.egl.SwapBuffers (/tmp/pip-0Hs1f_-build/kivy/lib/vidcore_lite/egl.c:7166)
    File "kivy/lib/vidcore_lite/egl.pyx", line 322, in kivy.lib.vidcore_lite.egl.raise_egl_error (/tmp/pip-0Hs1f_-build/kivy/lib/vidcore_lite/egl.c:1877)
    kivy.lib.vidcore_lite.egl.EGLError: EGL_NOT_INITIALIZED (code x3001)

    ```

    というエラーを吐いてプログラムを終了してしまいました。
    何が原因でしょうか…?調べても分かりませんでした。ご教授ください。よろしくお願いします。

    キャンセル

  • 2017/11/17 18:42

    当方での実行結果を追記しました。
    ログに何かエラー吐かれてますが、mainループは正常に動作しました。
    kivyは癖が強くてほとんど触ったことなく推測なのですが、ライブラリや環境の違い、かもしれません。

    キャンセル

  • 2017/11/17 18:51

    こちらはRaspbian GNU/Linux 8.0 (jessie)で動かしております。デバイス側の問題かもしれません。
    ありがとうございました

    キャンセル

  • 2017/11/17 18:55

    う~ん。お役に立てずすみません。

    キャンセル

  • 2017/11/18 07:04

    横から失礼します。このエラーはウインドウがおちているがコンソールが生きているとラズパイではエラーになるみたいです。
    ご参考までに。
    https://github.com/kivy/kivy/issues/5360

    少なくともこの方法ではラズパイでは使用できないみたいです

    キャンセル

  • 2017/11/20 18:03

    情報ありがとうございます。環境(ビデオライブラリ?)によるようですね。
    たまたまWin10では動作しているけど、やはり正しい閉じ方ではないかも。

    キャンセル

  • 2017/11/22 10:14

    お二方ともありがとうございます

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    kivyのテキスト1行入力ボックスを作るコード

    kivyを勉強中なのですが、tkinterのEntryのようにテキスト1行入力ボックスを作りたくて、公式サイトをみると一応作れるようにはなっているみたいなのですが、よくわかりません

  • 解決済

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

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

  • 解決済

    Python Kivy | kvファイルのButton.textをPyファイル側で受け取る方法

    KivyのButtonクラスにtextを入れ、Buttonをクリックしたときにクリックしたボタンのtextをpython側で取得するためにはどのように書くのがよいのでしょうか?

  • 解決済

    [kivy][python]kivyファイルを複数使いたい

    前提・実現したいこと 今、kivyファイルを1枚で作ってます。 ScreenManagerで画面切り替えをできるようにしています。 test.kvの中身が増えてきて、ごちゃごちゃし

  • 解決済

    Kivy 複数のScrollViewのスクロール量を同期させたい。

    KivyのScrollViewが複数あったとして、それらのスクロール量を同期させるためのコードを書いているのですが、リアルタイムで同期するにはどのようなコードを書けば良いですか?

  • 解決済

    Python Kivy の起動が遅い

    タイトル通りなのですが、kivyの起動が遅いと感じています。 改善する方法はないものでしょうか? どんなに短いコードであったとしても、平均4秒はかかります。 遅いときは10秒かかる

  • 解決済

    Kivy add_widgetしたウィジェットのイベント操作

          --2017 12/23 13:35 わかりやすくするために変更しました。--          実行可能な具体的なコードと一緒に質問を編集しました。 下記のコード

  • 解決済

    python3,kivy | idの値が見えない

     前提・実現したいこと TabbedPanel上のButtonを押すとTextInputから値を得る動作を実現するためにidを使おうとしたのですが、どうにも上手くいかず困っておりま

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

  • Python 2.7

    1259questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • Raspberry Pi

    799questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。