Pyxelから VSCodeで「デバッグ実行」すると以下のようなエラーが出て、画像の読み込みに失敗するようです。(通常のタスク実行であれば実行可能)
例外が発生しました: FileNotFoundError
[Errno 2] No such file or directory: '/Users/syun/.vscode/extensions/ms-python.python-2019.1.0/pythonFiles/cat.png'
File "/usr/local/lib/python3.7/site-packages/PIL/Image.py", line 2634, in open
fp = builtins.open(filename, "rb")
File "/usr/local/lib/python3.7/site-packages/pyxel/image.py", line 47, in load
pil_image = PIL.Image.open(filename).convert("RGB")
File "/Users/syun/Desktop/py_click/main.py", line 50, in __init__
pyxel.image(0).load(0, 0, "cat.png") # 画像読み込み
どうも読み込もうとしている画像のパスが、VSCodeのプラグインのパスを見ている様子……。
調べたところ、同じように悩んでいる人を発見。
・VSCode内であるPythonプログラムが実行できず、エラーが発生する
https://teratail.com/questions/162688
以下のような回答を発見
pyxel.image(0).load 内で、カレントディレクトリではなく、スタックからディレクトリを取得しているようですね。
def load(self, x, y, filename):
dirname = os.path.dirname(inspect.stack()[-1].filename)
filename = os.path.join(dirname, filename)ここを参照してください。
https://github.com/kitao/pyxel/blob/master/pyxel/image.py
どうやら、Pyxelが inspect.stack
を使っていることが原因のようです。
GitHub の Pyxel の Issue を見たところ、すでに報告されていた
・[Jupyter Notebook] Cannot load img with relative path #105
https://github.com/kitao/pyxel/issues/105
こちらによると、絶対パスで画像ロードすればできるけど……、と書いてあったので、該当のコードを絶対パスに修正
# pyxel.image(0).load(0, 0, "cat.png") # 画像読み込み
# 絶対パスで読み込み
pyxel.image(0).load(0, 0, "/Users/syun/Desktop/py_click/cat.png")
ひとまずこれで動きました。
バグフィックスされるまでは、 load() を直接使わずに絶対パスで読みこむ関数でラップした方が良さそうな感じです。
(もしくは VSCode の設定で回避できるかもしれない……)