ブログの主のねこぽんは独学のみで趣味のプログラミングをしています。まちがった知識や用語、偏った部分も多分にあると思います。このブログでプログラミングに興味をもち、プログラミングの流れだけをつかんだら他のプログラミングの本や本格的なブログへステップアップしていってもらえたら、とおもいます。
ラズパイでPython
Pythonって、なんかBasicと似てる。

今回はラズパイPythonのお話にゃ!



PythonってなんかBasicに似てるね。



プログラムには インタプリタ型 と コンパイル型があって、
その場その場で機械語に翻訳しながら実行していくのがインタプリタ型、とのことにゃ。Basic, Pythonがインタプリタ型なんだって。



へー! なんか似てると思ったらタイプが同じなのね。



まー、むずかしいことは忘れて触っていこー!



今回は短いプログラムなのでThonnyを使います! 軽いですね!
サンプルファイルをダウンロード!



ラズパイのブラウザからここ開いてダウンにゃよ
PythonTest.zip ラズパイでDL、またはWindowsからsambaでラズパイにファイル移動。





プログラムで遊ぶフォルダをねこっぴは「Programming」フォルダにしてるけど、好き好きでよいにゃ。ねこっぴの場合はこんな感じ。


サンプルファイルを展開。









元の圧縮ファイル消してすっきりしたね。
.pyを簡単にThonnyで開けるようにする。



pythonTest1.pyからお話していくにゃ。ついでに
.pyファイルをダブルクリックで開けるように関連付けしちゃうにゃ。







ちょっと最初どうなってたか忘れちゃったけど、もし初回でコレが出たら日本語にするにゃ。





出なくて英語だったらまず、ThonnyのWDの右上 「Switch to regular mode」をクリックして regular modeに。そしてThonny再起動。
再起動したらTools → Options から日本語にするにゃ。また再起動。







フォントはこの状態でスクショ取ってブログの記事にしてるにゃよ。「ツール」→ 「OPTION」 (初期状態のままかも)


サンプルファイルを見ていこー!



さて今回のサンプルプログラムを見ていくにゃよ。





まず説明聞く前に実行してどんなんか見てみます。
実行アイコンプッシュ!







どっかで見ましたよ….! あっ X68000の実験ときと同じなのね!



X68000同様 キーボードのテンキー 4,6,8,5 で上下左右。
今回は みなさんちのキーボードがテンキー付きじゃないかもなので カーソルキー でも移動できますにゃ。
Pythonのパターンを見極める



ちょっと強引にlabel自体を動かしてキャラにしてるけど、プログラミングの考え方という点の説明なのでPythonの流れのパターンをまず説明するにゃよ。
1:import文 (使うモジュールを書く)
2:まえおき。このプログラムに必要な定義とか変数とか書いちゃう。
3:サブルーチン
4:サブルーチン
5:メインプログラムを書く。
6:ループ!





Pythonのサブルーチン(関数)は、def というやつにゃ。



PythonはBasicと違って行は書かないけど
説明する用に行番号を言うにゃよ。
5:の 31行目から37行目までは、ある意味前置きなので2のグループでも良いにゃ。注意は、Pythonはサブルーチンを呼び出すときは、サブルーチン defのあとに書く。38行目ではprint_Ichiを呼んでるにゃ。これ2のグループに混ぜるとエラーになっちゃうにゃよ。



前回のBasicのサブルーチンは func だったね。前回は func前に呼んでても大丈夫だったけど、Pythonのときはあとっておぼえとこっと。
Python独自の書き方を見極める



実際の書き方の時のPythonの特徴にゃ。
1: 空白っていうか段落っていうかインデントっていうか。Pythonでは超重要。
2:defとか IFのあとは 「:」が必要 忘れがち。
3:IFのときは イコールふたつ。





その行の書き始めの位置、空白後の位置。これが重要なのね。



フォルダ分けなイメージかにゃ?
最上位のフォルダ、その中のフォルダ….
うまく伝わるかわからにゃいけど6行目の def で例えると…..
フォルダ内を上から順番に実行、みたいな。
IFのとこは条件一致でそのフォルダに入って 終わったら上位フォルダに戻り次の命令…。





あとは、「:」や IF文の 「==」は、エラー出るから あ忘れた!
でその内覚えるにゃ。 でもこのインデントミスはプログラム複雑になっていくと思う結果にならなくて原因探しまくったら間違えてた!みたいなめんどくさいことがあるかもなので注意かも。
今回のプログラムを細かく見ていきますよ。



じゃ順番に見ていこーかにゃ!


import



import tkinter
これ今回はGUIのウインドウに表示するために tkinterっていうモジュールを使うよ、ってことよね?モジュールっていうのが良くわからないのよね。



外部で用意されたでっかいサブルーチンみたいなもんかにゃ? 初期状態でインストールされているものもあるし、あとでインストールして組み込んでから使うもの、いろいろあるみたいにゃね。自分でも作れるらしい。ちょっと実験してみよー。
オリジナルモジュール実験のお話はここを開いてね。



この4つをThonnyで開いて準備してにゃ。タブ4つ状態。


import 実験1



moduleTest_MainA.py これがほんちゃんプログラムとしますにゃ。
ここで呼ぶ予定のモジュールはmoduleTestA.py







ほんちゃんプログラム moduleTest_MainA.py を実行。





moduleTest_MainA.py 4行目のmoduleTestA.Sub_02()
moduleTestA.pyの Sub_02 print文が実行されてるのね。なるほど。



ちなみにオリジナルモジュール moduleTestA.pyをそのまま実行だと、サブルーチンしか書いてないから実行してもなにもならないにゃよ。


import 実験2



次はmoduleTest_MainB.py これがほんちゃんプログラムとしますにゃ。
ここで呼ぶ予定のモジュールはmoduleTestB.py



あれ、なんかmoduleTestB.pyに
Pythonプログラムでよく見る謎コードあるね。







ほんちゃんプログラム moduleTest_MainB.py を実行。





???? 混乱!! どういう状況??



オリジナルモジュール moduleTestB.pyをそのまま実行してみようにゃ。


以上の結果から….。
「__name__」という謎変数には、
ほんちゃんプログラムからimportされて実行される場合「呼んだモジュール名」が代入される。
モジュールを直で実行した場合「__main__」が代入される。
代入結果から…、
ほんちゃんプログラムから実行 if __name__ == 「__main__」: 不一致。この先には行かない。
モジュールを直で実行 if __name__ == 「__main__」: 一致。この先が実行される。



謎変数はわかったわ。でも、moduleTest_MainB.pyの
import moduleTestB
moduleTestB.Sub_02()
で、Sub_02の結果Sub02_OKだけが表示されると思ったのに、
なぜ「名前が変わるよ~」のprint文まで実行されてるんだろ。
import moduleTestB だけを実行してみる。




結果 import文のみだけでmoduleTestB.pyが実行される。



なるほど。
importで1回実行されてdefが飛ばされつつprint文が実行される。
moduleTest.Sub_02() でmoduleTestB.py のSub_02だけ実行される。
結果 「名前が変わるよ~」「Sub_02_OK」の順になるのね。
使い方を完全把握しないとややこしいね….。
pythonの変数のお話





次はここのとこ。変数にゃ。X68000ではint(整数)、str(文字列)だったので似せたんだけど、Pythonの場合は 変数型指定しなくても大丈夫にゃ。


X:int=96 #intをいちおう指定する方法
Y:int=84 #intをいちおう指定する方法
X=96 #これでもOK
Y=84 #これでもOK



やっぱいろいろ違うね。



大丈夫にゃ。「Python」「変数」「整数」「文字列」google先生でテキトーに検索すれば構文すぐ出てくるにゃ。正確に覚えなくてヨシ。変数には型がある、とだけなんとなく覚えとけば大丈夫。



ただ、Pythonの変数で最初 番長も悩んだところがあってにゃ。全部に効果がある位置に変数を記入しても、中身を書き換えるときは「global」を書いてやらなきゃだめっぽいにゃ。下のサブルーチンとこのにあるにゃね。
サブルーチンのお話





今回は3のとこでちょっと特殊なサブルーチンつかってるにゃよ。



特殊?



プログラム中で subroutine() とかで呼ぶんじゃなくて、バインドっていうやつなんだけど、全自動、連動みたいなイメージでいいかにゃ。あとで説明するにゃ。
メインプログラム部分。





メインプログラムっていうか、プログラムの内容によってはループさせるサブルーチンに飛ばしたりなので、メイン部分はどこだと言われるとさまざまだとは思うんにゃけど、今回はウインドウを使ってる部分をもってきたにゃ。



冒頭であるように、まえおきに書いても大丈夫な部分だよね。設定部分というか。38行目はダメ…でしたっけ。



まとまってると説明しやすいからこうしてあるにゃよ。importした、GUIでプログラムが組める tkinterを使ってウインドウを表示する部分にゃ。
ウインドウを表示して、文字を表示するパーツ(label)を2つ作ってその一つをキャラとして移動させるかんじで書いてあるにゃ。



カンだけどタイトルの文字、ウインドウサイズ、ラベルの文字と位置が書かれてる最初の定義って感じね。



そんな感じにゃ。
番長もはじめて tkinterを使ってるけど、アレンジでボタンを設置して操作させたりしたい場合は「 tkinter」「ボタン」とかでいくらでも検索かかるはずにゃから、余裕できたら調べてみるのも楽しいかも。
print_Ichi()は、X68000と同じくスタート時にキャラ表示させるためにゃよ。
ループ部分。





X68000のときはwhile文でキーインプット部分をループさせたにゃ。 tkinter は ボタンとか設置してボタンを押されたときのイベントを def で記入して41行目みたいに書いとけば自動的にボタン押されまちループが出来上がるっぽいにゃ。だけどマウスの入力待ち、キーボードからの入力待ちはバインド(bind)という方法をするにゃ。



ここがサブルーチンで特殊だっていってた部分ね。
このbind文を書けば、キー入力まちサブルーチンが自動でぐるぐるまわってくれてるイメージなのね。いつでも待ちになってる、みたいな。
Thonnyで実際ながれを追ってみよう。



Thonnyのデバッグモードで1行づつどういう流れでプログラムが動いてるかわかるにゃ。やってみよう!pythonTest1.pyを開いてこのボタンにゃ。





そしてつぎからはここのボタン。順番に実行されるにゃ。





おもしろいね! ちゃんとサブルーチン def に飛んでたりして!



ここまできたらキー入力待ちになってるにゃよ。キー押してみて。





キーを押したらキー入力待ちルーチンに行ってるね!
ステップインボタンでその続きも見れます!





あと、print(key.keycode) で押されたキーをシェルに表示してるにゃ。この数値を見てカーソルキーやテンキーの数字確認して設定したにゃよ。


もうぜんぜんUARTと関係ないけどあたり判定。



pythonTest2.pyに、ちょー簡単なやつの当たり判定入れてあるにゃ。単純にXY軸が※マークと一致であたり、という判定にゃ。ちなみにXY軸の12づつ増やしてるのはなんとなく動かしてるlabelがキャラ単位で動いてるかんじの数値にゃよ。





なんか細かい数字だと思ったのはそういうことだったのね。
なんとなくPythonもわかってきましたーよー!
・
・
・
- X68000Z UARTでなにができるの?
- X68000Zを動かしてみよう! X-Basic準備
- どのラズパイを選べばいいかな?
- ラズパイUART設定とケーブル接続
- ラズパイとのUART接続確認テスト
- MIDI再生専用FDを作成(mt32pi)
- MIDI再生専用FDを作成(ttymidi)
- mt32-piでラズパイをMIDI音源にする
- MIDIハード音源を試す
- DACとちびモニターを用意する
- X68uartRasModuleの製作 準備編
- X68uartRasModuleの製作 組立編
- アップデートとHDDの設定
- SX-Window HDDにインスト
- SX-Window MIDI演奏設定
- SX-Window MIDIハード音源設定
- プログラミング編 X-Basicになれてみる
- プログラミング編 Pythonに少し慣れてみる
- プログラミング編 UARTでX68kZからラズパイを操作!
- シェルスクリプトSW分岐とLチカ
- ちびモニタとLEDを制御する!
- ttymidiのUSBの関連付け自動
- Python実行形式にするPyInstaller
- Winkipedia/2chSC閲覧 X68k RasNet
- X68000Zの基本操作などのまとめ
- 番外編はTOPから!