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

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

ただいまの
回答率

90.47%

  • Python 3.x

    6876questions

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

【Kivy】kvファイルをロードできていないのでしょうか?

解決済

回答 1

投稿

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

Re1

score 2

 前提・実現したいこと

Kivyのエラーを解決したい

 発生している問題・エラーメッセージ

[INFO   ] [Logger      ] Record log in C:\Users\user\.kivy\logs\kivy_18-06-07_2.txt
[INFO   ] [Kivy        ] v1.10.0
[INFO   ] [Python      ] v3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)]
[INFO   ] [Factory     ] 194 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_gif (img_pil, img_ffpyplayer ignored)
 Traceback (most recent call last):
   File "C:\Users\user\Desktop\Py\NewGUIGame\main.py", line 71, in <module>
     ShootingApp().run()
   File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\app.py", line 801, in run
     self.load_kv(filename=self.kv_file)
   File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\app.py", line 598, in load_kv
     root = Builder.load_file(rfilename)
   File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\lang\builder.py", line 301, in load_file
     return self.load_string(data, **kwargs)
   File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\lang\builder.py", line 350, in load_string
     parser = Parser(content=string, filename=fn)
   File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\lang\parser.py", line 392, in __init__
     self.parse(content)
   File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\lang\parser.py", line 501, in parse
     objects, remaining_lines = self.parse_level(0, lines)
   File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\kivy\lang\parser.py", line 664, in parse_level
     if current_property[:3] == 'on_':
 TypeError: 'NoneType' object is not subscriptable

 該当のソースコード

from kivy.app import App
from kivy.clock import Clock
from kivy.properties import (
    ListProperty,
    NumericProperty,
    ObjectProperty,
    ReferenceListProperty,
)
from kivy.uix.widget import Widget
from kivy.vector import Vector


class Player(Widget):
    """プレイヤー"""

    pass


class Shot(Widget):
    """プレイヤーの弾"""

    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(10)
    velocity = ReferenceListProperty(velocity_x, velocity_y)

    def move(self):
        """弾の移動処理"""

        self.pos = Vector(*self.velocity) + self.pos


class ShootingGame(Widget):
    """ルートウィジェット。シューティングゲーム全体の管理"""

    player = ObjectProperty(None)
    shots = ListProperty()

    def on_touch_move(self, touch):
        """タッチしたまま移動でプレイヤー移動"""

        if 0 < touch.x < self.width:
            self.player.center_x = touch.x

    def on_touch_down(self, touch):
        """画面タッチで弾発射"""

        shot = Shot(pos=self.player.center)
        self.shots.append(shot)
        self.add_widget(shot)

    def update(self, dt):
        """1/60秒毎に呼ばれる、ゲーム更新処理

        各ショットの移動処理や、敵キャラの移動、それぞれの衝突判定を行う
        """

        for ball in self.shots:
            ball.move()
            if (ball.y < self.y) or (ball.top > self.top):
                self.remove_widget(ball)
                self.shots.remove(ball)


class ShootingApp(App):

    def build(self):
        game = ShootingGame()
        Clock.schedule_interval(game.update, 1.0 / 60.0)
        return game

ShootingApp().run()
<Player>:
    size: 100,100
        canvas:
            Rectangle:
                pos: self.pos
                size: self.size
                source: "image/player.png"

<Shot>:
    size: 10, 30
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size

<ShootingGame>:
        player: player

        canvas:
            Rectangle:
                pos: self.pos
                      size: self.size
                      source: 'image/background.jpg'

    Player:
        id: player
        pos: root.center_x - self.width/2, 0

 補足情報

Python 3.6.4
kivy 1.10.0

これはあるサイトのコードですが、どうもコードの問題ではないようなのでこちらで質問させていただきました。pyファイルもkvファイルも同じフォルダに入れています。kvファイルの名前はshooting.kvです。
自分はまだkivyやPythonに触れて間もないので優しく教えてくださると助かります。よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

どうもコードの問題ではないようなので

いえコードの問題です。とあるサイトに掲載されているkvファイルはおそらく著者さんの環境では動いているのでしょうが、変なところにタブコードが混入しておりコピペしてもそのまま動かないという罠つきの(w;)ソースコードです。次のように修正するととりあえず動くと思います。

<Player>:
    size: 100, 100
    canvas:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'player.png'

<Shot>:
    size: 10, 30
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size

<ShootingGame>:
    player: player

    canvas:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'background.jpg'

    Player:
        id: player
        pos: root.center_x - self.width/2, 0

上のコードはサイトに掲載されているソースからタブ文字を全て削除し、インデントを正しく整えただけのものです。(質問者さんのコードは'image/player.png'になってますが、オリジナルでは'player.png'となっています。上のコードはオリジナルのままにしてます)


元の記事ではタブ文字のためソースの見た目自体がおかしくなってますが、記事の著者さんはそれに気づいてないようです。インターネット上の個人サイトのコードにはこうした不備もままあるので、読み手側もそれに気づき自分で修正できるぐらいの最小限の知識をもって参照した方がよいでしょう。

「PythonやKivyのコードでは字下げに注意」してください。全角文字がNGなのはもちろんのこと(文法的には禁止されていないとはいえ)タブ文字も使わないのが吉です。本件のように混乱の元になるからです。

PythonもKivyも「一段階の字下げは必ず半角スペース4文字」というルールを厳密に守ることをお奨めします。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/08 19:44

    とても詳しい解説、ありがとうございます!
    Pythonのエラーの内容からてっきりコードの問題ではないと思ってしまいました、、、
    今回のことでサイトの内容を鵜呑みにせず、自分で考える必要があると痛感しました。これからKivyのことを勉強していくので、また何かあったらよろしくお願いします!

    キャンセル

  • 2018/06/08 23:08

    多分サイトで見た目を整えるためにしたんだと思います、GitHubを参考にされたらいいとお思います
    https://github.com/mkgask/kivySimplePlayer/tree/
    こちらのコードだと普通に動きます。

    >PythonもKivyも「一段階の字下げは必ず半角スペース4文字」
    Kivyは実はこれは最近かと思います。kivy 1.10.0より前のバージョンですと最初のスペースの数に合わせるという内容になるかと思います。ご参考までに。

    キャンセル

  • 2018/06/08 23:55

    > 多分サイトで見た目を整える

    ありゃ、そうなんですか?自分が見たのはgithubではなく解説ページにcode-prettify(かな?)で整形された状態のkivyスクリプトだったのですが、見た目はこの質問本文にあるとおりで、<Player>のsizeとcanvasの字下げがあっておらずcanvasの方が一段下の階層になってました。本来sizeとcanvasは同じ字下げレベルにすべきで見た目を整える目的でcanvasを字下げする意味はないと判断したのですが・・・
    何か勘違いしてるでしょうか?

    キャンセル

  • 2018/06/09 00:12

    多分元のコードを載っけてたサイトの人間ですが、修正しときました。

    キャンセル

  • 2018/06/09 00:32

    恐縮です。「不備」なんて言ってしまいましたが失礼の程はご容赦くださいませ。

    キャンセル

関連した質問

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

  • Python 3.x

    6876questions

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