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

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

ただいまの
回答率

90.51%

  • Python 3.x

    6325questions

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

Python Kivy の起動が遅い

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 955

vibrato

score 20

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

プログラム経験も浅いので、どれほどの起動速度が平均なのかもわかりませんが、
ユーザー目線で言えば、1秒以下であるのが望ましいかなと思います。
(フル3Dなどのゲームならば10秒くらい待つのも解るのですが…)

例えて言えばQRコードリーダーのようなアプリを作るとしたとき起動に10秒かかっていては、
サービスとして大きな欠点になり得ると思うので、出来れば起動を速くしたいのですが、
何か改善する方法はありますでしょうか?

ご教授のほど宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+3

こんな感じでスプラッシュスクリーンを用意して、それを表示してからkivy関連のコードが走るようにしてはいかがでしょうか?UXの観点から、ただ無反応に待たせるよりは心象がよくなると思います。

from threading import Thread
from tkinter import Label
from tkinter import Tk


class Splash(Thread):
    def __init__(self, text, factor=0.4):
        Thread.__init__(self)
        self.setName("Splash")
        self.setDaemon(True)
        self.text = text
        self.factor = factor
        self.screen = None

    def run(self):
        self.screen = Tk()
        Label(self.screen, text=self.text).pack()
        screen_w = self.screen.winfo_screenwidth()
        screen_h = self.screen.winfo_screenheight()
        w, h = screen_w * self.factor, screen_h * self.factor
        x, y = (screen_w/2) - (w/2), (screen_h/2) - (h/2)
        self.screen.geometry("%dx%d+%d+%d" % (w, h, x, y))
        self.screen.overrideredirect(True)
        self.screen.mainloop()

    show = Thread.start  # Alias

    def hide(self):
        if self.screen:
            self.screen.quit()

    def __enter__(self):
        self.show()

    def __exit__(self, *_):
        self.hide()


with Splash("ちょっとまってね"):
    from kivy.app import App
    from kivy.uix.button import Button


class TestApp(App):
    def build(self):
        return Button(text='Hello World')


if __name__ == '__main__':
    TestApp().run()

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/14 01:53

    回答ありがとうございます。
    わざわざコードまで書いていただき重ねてありがとうございます。

    >>ただ無反応に待たせるよりは心象がよくなると思います。
    試しに実装してみたところ、確かに同じ待機時間であれば、だんぜんこちらの方が良いと解りました!
    とても勉強になりました!

    ただ、今回は質問での例えで書いた様に、QRコードの様なレスポンス重視のサービスを作ろうと考えていますので、別の機会があればこの教えていただいた方法を用いて、取り組んでいきたいと思います。
    ありがとうございました!

    キャンセル

checkベストアンサー

+1

端的に言えば改善する方法は使用するPCのグラフィックボードの性能を上げるしかないです。

なぜKivyの表示が遅いかというと実は質問の中に答えがあります。

>フル3Dなどのゲームならば10秒くらい待つのも解るのですが…
Kivyは画面の描画に3次元コンピュータグラフィックス用 API であるOpenGLを使用しています。なので実は描画に関していうと2Dのように見えますが実はフル3Dになります。なので描画は遅いです。

これは推測ですがマルチプラットフォームということでどの環境でも同じUIを表示しようとした結果OpenGLを描画に使用したのだと思います。

<参考>Programming Guide(翻訳済み) » Architectural Overview(翻訳済み)

そのため起動を早くするのであれば描画を別のものに置き換える必要があって海外だとKivyの公式とは別にwebkitで描画しようとしたりモバイルであればネイティブなパーツで置き換えようとしている人はいるのですがあまり目立った成果はでていないみたいです。

なので起動を早くする方法は現在のところグラフィックボードを良いものを入れるとかしかないです。例えばGTX1060とかで動かすと起動は1秒ぐらいになります。

>例えて言えばQRコードリーダーのようなアプリを作るとしたとき起動に10秒かかっていては、サービスとして大きな欠点になり得る

たぶんサービスの内容にもよるのですが毎日起動してちょっと動かすみたいアプリはKivyは不向きかもしれません。

起動を早くする方法はないですが、ほかの方が指摘されているようにスプラッシュスクリーンを入れるとかするとだいぶ印象は変わってくるかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/14 02:12

    回答ありがとうございます。
    >>Kivyは画面の描画に3次元コンピュータグラフィックス用 API であるOpenGLを使用しています。
    >>なので描画は遅いです。
    こちらのお話は事前情報があり多少頭の片隅にはあったのですが、

    >>あまり目立った成果はでていないみたいです。
    >>現在のところグラフィックボードを良いものを入れるとかしかないです。
    こちらを聞いて撃沈です;

    >>ちょっと動かすみたいアプリはKivyは不向きかもしれません。
    そうなんですね;もう少し試行錯誤し、それでもだめなら別の手段を考えます。

    丁寧に教えていただきありがとうございました!

    キャンセル

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

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

関連した質問

  • 受付中

    kivyが全画面表示になってしまう

    raspberry pi2上でkivyのアプリケーションを作っているのですが、必ず全画面で実行されてしまいます。なんとか全画面表示を解除する方法はありませんか? ちなみに調べ

  • 解決済

    pythonのGUI kivyについて

    前提・実現したいこと Python Kivyの使い方① ~Kv Languageの基本~ この記事の 17.画像の表示(ボタンによる画像切り替え) について

  • 解決済

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

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

  • 解決済

    Python Kivy メソッドを呼び出したがAttributeエラーが起きる

    Python Kivyを使用しています。 下記のようなコードを書きました。ディレクトリ構造も一応書きました。 目標はAクラススクリーンをBクラスに遷移することですが。 どう

  • 解決済

    Kivy toolchainのコマンドで全てのbuildを一括で行うコマンド

    こんにちは、kivyユーザーです。 ど忘れしてしまったのですが、Kivyのtoolchainコマンド(./toolchain.py build openssl kivyなどのコマン

  • 解決済

    Kivyのボタン入力と表示に関して。

    Kivy入門サイトを参考に、ボタンで入力された数字キーを表示するディスプレイを作ろうとしています。 0ボタンが押されたときにフレーム上段のディスプレイに0と表示させたいのですが、何

  • 解決済

    kivyのエラーについて

    https://qiita.com/dario_okazaki/items/7892b24fcfa787faface を参考に, pythonでkivyを使ってテキストとボタンを追

  • 受付中

    python kivy garden.rouletteが動かない

     前提・実現したいこと pythonのkivyを使用してGUIを作っています。kivy.garden.rouletteを使って、ルーレット状の年月日選択をするwidgetを出したい

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

  • Python 3.x

    6325questions

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