LoginSignup
3
4

More than 3 years have passed since last update.

ScratchのプロジェクトをPythonに変換する

Last updated at Posted at 2020-06-06

初めに

なぜ、こんなことをしようと思ったのかというと、僕がScratchからPythonに切り替えた時ぐらいに、「ScratchからPythonに変えられないかな...」と思っていた。
それでPythonがわかってきて、UnityやC#をやっているときに、
「そういえば、ScratchからPythonに変えるやつないんかな...探してみよ」
「ないやん...」
「せや、自作したろ。」
という感じで制作を決意した。

その一

解析対象探し

まずはScratchのプロジェクトファイルをダウンロードしたときに.sb3ファイルが手に入る。sb3ファイルが解析できないと何もできない。なので「sb3ファイル 解析」と調べると、Scatchプロジェクトに使われている変数の名前などを表示するサイトに行き着いた。そのサイトは拡張子を.zipに変えてドラッグしてや。というので、これはもしやと思い拡張子を.zipに変えてみて、展開してみると、見るからに怪しそうなjsonが見つかった。そいつの中身を見てみると、明らかにブロックなどのことを書いている。とりあえずこれで解析対象のファイルが見つかった。
projectj.png

GUIを作る

その当時は配布したかったので、だれでも実行できるやつにしたかった。PythonTkinterで作ると、pythonをインストールしている人しか実行できないので、C#Formにして、GUI部分を作った。
GUI.png

zip解凍

ZipArchive(C#)クラスを使えば何とかなった。

その二

json解析

C#でJson解析をしようとしても、なんかそれ専用のクラスを作らないといけなかったので、渋々PythonのJsonモジュールを使うことにした。あんなことやこんなことをして無事Jsonの解析は終わった。ちなみに、Pythonの実行を自動でするために、System.Diagnostics.Processを使って、実行することにした。

書き込み

C#で書き込もうと思ったが、Json解析をpythonで済ましちゃっているのでpythonで書き込むことにした。しかし、書き込むファイルの場所と名前を指定しなくてはいけないので、 実行時に引数を入れて、そいつをsys.argvで読み込むことにした。あとはopen()してJson解析時のif地獄の中にwrite()してやればOK。

最後に

これは配布すべきなのか?配布してしまったらこのツールに頼ってしまわれそうで怖い。(そもそもダウンロードする人がいるのか?)
一部のブロックには対応してない。これは決して面倒くさいというわけではなく、これ以上のことをしたいならPythonを使えということである。

おまけ:手こずったところ

Json解析

jsonファイルのブロック定義は一つのブロックごとに分けられている。一つの演算子も一つの塊になっている。つまり5+5+5+5+5という計算をするときには再帰関数を使ってした。しかしそれでは1000近くしかできないので、もっといい案あったら教えてください。

書き込み

ずっとf文字列を完成間近まで知らなかった為、ずっと.format()を使っていた。C#の\$文字列みたいなのがあったらいいなと思ってググってみたら、f文字列があってfすげええってなってた。たぶんf文字列とか\$文字列とかの言い方が違う。

スタック

ifとかforのブロックを抜け出した後に、elseとかその下のやつを書き込まないといけないのでそのelseや下のやつをリストに保存していて、呼び出すときは今の層-1していたんだけど、こんなやつ

if True:
    if True:
        if True:
            if True:
                print("Hello")
    print("World")#-2されている。ってかand使えよ

とかあったので、ifの時の階層を一緒に保存することにした。

本当に最後に

わけわからんところもあったと思いますが、ここまで見ていただいてありがとうございました。

追記

公開しました
https://www.axfc.net/u/4023085

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4