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

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

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

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

Q&A

解決済

1回答

1654閲覧

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

Re1

総合スコア8

Python 3.x

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

0グッド

0クリップ

投稿2018/06/07 11:26

前提・実現したいこと

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

該当のソースコード

Python

1from kivy.app import App 2from kivy.clock import Clock 3from kivy.properties import ( 4 ListProperty, 5 NumericProperty, 6 ObjectProperty, 7 ReferenceListProperty, 8) 9from kivy.uix.widget import Widget 10from kivy.vector import Vector 11 12 13class Player(Widget): 14 """プレイヤー""" 15 16 pass 17 18 19class Shot(Widget): 20 """プレイヤーの弾""" 21 22 velocity_x = NumericProperty(0) 23 velocity_y = NumericProperty(10) 24 velocity = ReferenceListProperty(velocity_x, velocity_y) 25 26 def move(self): 27 """弾の移動処理""" 28 29 self.pos = Vector(*self.velocity) + self.pos 30 31 32class ShootingGame(Widget): 33 """ルートウィジェット。シューティングゲーム全体の管理""" 34 35 player = ObjectProperty(None) 36 shots = ListProperty() 37 38 def on_touch_move(self, touch): 39 """タッチしたまま移動でプレイヤー移動""" 40 41 if 0 < touch.x < self.width: 42 self.player.center_x = touch.x 43 44 def on_touch_down(self, touch): 45 """画面タッチで弾発射""" 46 47 shot = Shot(pos=self.player.center) 48 self.shots.append(shot) 49 self.add_widget(shot) 50 51 def update(self, dt): 52 """1/60秒毎に呼ばれる、ゲーム更新処理 53 54 各ショットの移動処理や、敵キャラの移動、それぞれの衝突判定を行う 55 """ 56 57 for ball in self.shots: 58 ball.move() 59 if (ball.y < self.y) or (ball.top > self.top): 60 self.remove_widget(ball) 61 self.shots.remove(ball) 62 63 64class ShootingApp(App): 65 66 def build(self): 67 game = ShootingGame() 68 Clock.schedule_interval(game.update, 1.0 / 60.0) 69 return game 70 71ShootingApp().run() 72

kivy

1 2<Player>: 3 size: 100,100 4 canvas: 5 Rectangle: 6 pos: self.pos 7 size: self.size 8 source: "image/player.png" 9 10<Shot>: 11 size: 10, 30 12 canvas: 13 Ellipse: 14 pos: self.pos 15 size: self.size 16 17<ShootingGame>: 18 player: player 19 20 canvas: 21 Rectangle: 22 pos: self.pos 23 size: self.size 24 source: 'image/background.jpg' 25 26 Player: 27 id: player 28 pos: root.center_x - self.width/2, 0 29

補足情報

Python 3.6.4
kivy 1.10.0

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

いえコードの問題です。とあるサイトに掲載されている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/07 23:31

編集2018/06/07 23:33
KSwordOfHaste

総合スコア18394

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

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

Re1

2018/06/08 10:44

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

2018/06/08 14:08

多分サイトで見た目を整えるためにしたんだと思います、GitHubを参考にされたらいいとお思います https://github.com/mkgask/kivySimplePlayer/tree/ こちらのコードだと普通に動きます。 >PythonもKivyも「一段階の字下げは必ず半角スペース4文字」 Kivyは実はこれは最近かと思います。kivy 1.10.0より前のバージョンですと最初のスペースの数に合わせるという内容になるかと思います。ご参考までに。
KSwordOfHaste

2018/06/08 14:55

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

2018/06/08 15:12

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

2018/06/08 15:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問