
Ubuntu日本語フォーラム

ログインしていません。
こんにちは
PythonとPygameを勉強しているんですが、
http://www.halb-katze.jp/pygt/pygt0901.html
↑で勉強しているんですが、コンパイルするとエラーになってしまいます。
cola@cola-PC:~/pro$ python test.py
Traceback (most recent call last):
File "test.py", line 26, in <module>
if __name__ == '__main__': main()
File "test.py", line 10, in main
screen = gu.init((SCR_W, SCR_H), 'Font Practice 1')
File "/home/cola/pro/gameutil.py", line 6, in init
pygame.init()
NameError: global name 'pygame' is not defined
上のurlのコードをコピペしました。
変えたところは一行目の
# -*- coding:sjis -*-
を
# -*- coding:UTF8 -*-
にしました。こうしないとエラーになってしまうからです。
NameError: global name 'pygame' is not defined
の意味がわかりません。
ちなみにPythonとPygameのインストールした方法は、「solarwol」というゲームをインストールしたら一緒にインストールされました。
調べたら「Python2.6」と「python-pygame」です。あとは手動で「Python2.6-dev」をインストールしました。
解決方法を教えてください。ちなみに上のサイトをはじめから全部書いてます。gameutil.pyも同じファイルに保存してあります。
JapaneseCodecsは以下のようにインストールしました。
# cd /usr/local/src
# sudo wget http://www.python.jp/pub/JapaneseCodecs/JapaneseCodecs-1.4.11.tar.gz
# tar xzvpf JapaneseCodecs-1.4.11.tar.gz
# cd JapaneseCodecs-1.4.11
# sudo python setup.py install
でできたと思います。
解決策お願いします(´・ω・`)
オフライン
cola による投稿:
こんにちは
こんにちわ。
cola による投稿:
コンパイルするとエラーになってしまいます。
一応念の為に。
確かにPythonでは内部的にはソースをバイトコンパイルしますが、一応インタプリタです。ですから(C言語的な意味では)コンパイルを行なう事はありません。単なるエラーですね。
cola による投稿:
http://www.halb-katze.jp/pygt/pygt0901.html
↑で勉強している
このページのコードでいいんですね?じゃあ、ちょっとエラー内容を見ていきます。
コメントを付加していきますんで、意味を見ていってください。
cola による投稿:
cola@cola-PC:~/pro$ python test.py
Traceback (most recent call last):
File "test.py", line 26, in <module> # test.py の26行目の
if __name__ == '__main__': main() # main() で問題が発生しているよん
File "test.py", line 10, in main # test.py の main の10行目には
screen = gu.init((SCR_W, SCR_H), 'Font Practice 1') # screen って変数が使われてるんですけど
File "/home/cola/pro/gameutil.py", line 6, in init # そこに含まれてるgameutil.py の6行目には
pygame.init() # pygame.init() っつーメソッドがあるけど
NameError: global name 'pygame' is not defined # 大域名で pygame なんつーのはないよん
分かりますかね?エラーが起きてるのはtest.pyじゃなくってそれが呼んでるgameutil.pyの方なんです。
gameutil.pyってのは次のページのブツですよね。
http://www.halb-katze.jp/pygt/pygt0800.html
こんな風に書かれています。
# gameutil.py
# game utility functions
def init(size=(200,100), title='non title'):
"""initialize all and make surface using pygame.init()"""
pygame.init()
scr = pygame.display.set_mode(size)
scrRect = scr.get_rect()
pygame.display.set_caption(title)
return scr
def load_image(filename, ckey=None):
"""あらゆるイメージをロードし、imageオブジェクトを返す。
filename:ファイル名
ckey:Colorkey設定。-1だと画像の左上ピクセルの色を拾う。"""
try:
img = pygame.image.load(filename)
except pygame.error, message:
print '画像を読み込めません', filename
raise SystemExit, message
img = img.convert()
if ckey != None:
if ckey == -1:
ckey = img.get_at((0,0))
img.set_colorkey(ckey, RLEACCEL)
return img
#EOF
これは例として書かれてるみたいですが、見て分かるように、pygameがimportされていません。また、エンコードの指定もないんで、これはこのままだとエラー一直線です。これが原因ですね。
これは恐らく自作モジュールを作ろう、と言うお題でしょうけど、Pythonは1ファイル1名前空間、と言う原則があります。従って、別なモジュールでpygameをimportしていたとしても、「大域的」にはpygameと言う名前が認識される事はありません。要するに局所的に使われる名前となるんで、従ってインタプリタが
pygameは大域名として定義されてないよん
と文句を言ってくるわけです。
これを避ける為には上のgameutil.pyの冒頭に
# -*- coding: utf-8 -*-
import pygame
の二行を付け加えれば良い筈です。
オフライン
変えたところは一行目の
# -*- coding:sjis -*-
を
# -*- coding:UTF8 -*-
にしました。こうしないとエラーになってしまうからです。
勉強をするというのは、意味を理解して応用ができるよう、次につなげることができるようにして行くくことです。
サイトをこぴぺして、わからないことは質問してその結果をまたこぴぺ・・・というのは、勉強とは言わないと思います(ものが動くので勉強したつもりにはなりますが・・・・しいていうなら、「体験」でしょうか。)。目標は、体験でしょうか?学習でしょうか?
学習が目的であるなら、まず、なぜうまくゆかないのか、どの辺にどんな問題がありそうなのか、自身の意見も書いて(答えではなく)意見や調べ方を求めてみてはいかがでしょうか。今のところ、解決したもの含めて2か所(上記引用のエラーと、今出ているglobal name 'pygame' is not definedの部分)ありますから、その2点について書いてみてはいかがでしょうか。
※発生したエラーや不具合を(あてずっぽうではない方法で)解決できるかどうかが、プログラムを作れる/作れないの境目だと思っています。
また、そっくり同じにしているつもりが動かないという場合、同じ部分は書かなくてもよいだろうと考えてしまいますが、本当に全部そっくり同じなら、ちゃんと動く可能性も高い と推測できます(動作未検証のソースを載せている書籍やサイトは除く。)
test.pyとgameutil.pyの内容も(cat test.py等で)掲載することをお勧めします。
オフライン