ラズパイ(ラスベリーパイ、Raspberry Pi)は1式1~2万円でそろえられる教育用の安価なコンピュータです。
プログラミング言語のPythonもすぐ利用できるので、プログラミングを試すにもちょうどいいです。
ラズパイでPython
Pythonコンソールを使う
メニューにない場合、「設定>MainMenuEditor」を開き、Pythonにチェックを入れます。
メニューからPythonが呼べるようになったら実行します。
すると以下のようなコンソール画面が開きますので「help」などのコマンドを実行してみましょう。
IDEを使う
プログラムを書いて実行する環境もそろっています。
ここではThonnyPythonIDEを使ってみます。IDEとは「統合開発環境」で、プログラムを作るうえで必要なコンソールやデバッガなどがひとまとめになっている開発環境のことです。
メニューから「プログラミング>Thonny Python IDE」へアクセスします。
プログラムを書く
「New」で新しいファイルを作ります。
まずは適当に?Pythonでプログラミングを書き、「Save」でファイルを保存します。
Pythonの場合は、拡張子「py」のファイルになります。例えば「test.py」などのファイル名で保存します。
作成ファイルは「Documents>pythonproj」内にできます。
プログラムを実行する
プログラムを実行するのも簡単です。
上の「Run」ボタンで動き出します。
止めたい場合は「Stop」を押します。
試しに「print("ok")」と書いてみます。これはOKと出力させる命令です。
実行すると、下のコンソールに「OK」と出ます。
カメラで撮影する
カメラの接続については以下参照ください。
Pythonから制御するにはほぼほぼ以下サイトのソースでいけました。
picameraというライブラリが必要なので、動かない場合は入っているか確認しておきましょう。
解像度等変更して以下のように書いて実行しました。
なお、ファイルはPYファイルと同じディレクトリに作成されます。
import time
import picamerawith piccamera.PiCamera() as camera:
camera.resolution = (360,240)
camera.start_preview()
time.sleep(2)
camera.capture('test.jpg')
Pythonでウィンドウを作る
Visual Studioなどでウィンドウインタフェースを作るのに慣れていると、ラズパイPythonでもウィンドウを作りたいかもしれません。
PythonではTkinterというライブライを使うとウィンドウの管理がしやすいです。
ウィンドウを作る
最初にライブラリをインストールします。
「$ sudo apt-get install python3-tk」で入れます。
インストール後は
import tkinter
root = tkinter.Tk()
だけでウィンドウを確認できます。
ウィンドウに要素を追加する
ラベル
ラベルは文字だけのパーツです。
guiLabel = tkinter.Label(text=u'python sample')
guiLabel.pack()
のように文字を指定して作ります。
文字入力
文字入力用フィールドは
guiEditbox = tkinter.Entry()
guiEditbox.pack()
のように作ります。
ボタン
ボタンは
guiButton = tkinter.Button(text=u'OK')
guiButton.pack()
のように作ります。
ボタンの命令を書くには
guiButton.bind("<Button-1>",btnFunc)
のようにします。
<Button-1>は左クリックの意味です。
btnFuncは実行する関数を定義してその名前となります。
def btnFunc(event):
messagebox.showinfo('message','Bingo!');
などと定義しておきます。
以上の要素を組み込むと
import tkinter
from tkinter import messagebox
def btnFunc(event):
messagebox.showinfo('message','Bingo!')
root = tkinter.Tk()
guiLabel = tkinter.Label(text=u'python sample')
guiLabel.pack()guiEditbox = tkinter.Entry()
guiEditbox.pack()guiButton = tkinter.Button(text=u'OK')
guiButton.bind("<Button-1>",btnFunc)
guiButton.pack()
root.mainloop()
実行するとウィンドウが作られます。
ボタンを押すとダイアログがでます。
図形を描く
図形をウィンドウ上に描くには、まずキャンバスという部品を設置します。
以下のように背景色とサイズを指定してキャンバスをつくり、XY座標を指定して配置すればOK。
canvas = tkinter.Canvas(bg='black',width=400,height=300)
canvas.place(x=0,y=0)
実行すると、黒い部分がキャンバスとなります。
canvasの大きさをいちいちウィンドウに合わせるのが面倒なら以下のような書き方で自動的に広がります。
canvas = tkinter.Canvas(bg='black')
canvas.place(x=0, y=0, relwidth=1.0, relheight=1.0)
キャンバスができれば、あとはそこに文字や図形を描画します。
文字を書くには「create_text」を、
直線は「create_line」を、
矩形は「create_rectangle」を使います。
座標や色などのパラメータを指定して以下のように書いてみます。
canvas = tkinter.Canvas(bg='black',width=400,height=300)
canvas.place(x=0,y=0)
canvas.create_text(100,20,text = 'This is a test.')
canvas.create_line(100,120,150,120)
canvas.create_line(200,120,250,120,width='10')
canvas.create_rectangle(100,220,150,250)
canvas.create_rectangle(200,220,250,250,fill='red')
実行するとこんな感じです。
画像を表示する
Canvasを使えば画像ファイルを読み込んで表示することもできます。
まず画像用モジュールを使うために「from PIL import Image, ImageTk」を宣言します。
ない場合「sudo apt-get install python3-pil python3-pil.imagetk」のようにPython3用のimagetkをインストールしておく必要があります。
いくつかサイトを参考に試したら動かなかったのですが、以下サイトを参考にしたら動作しました。
Python - pythonでtkinterを使ってcanvasにimg3ファイル内にある画像を表示させたいです。|teratail
import tkinter
from PIL import Image, ImageTkroot = tkinter.Tk()
root.geometry('640x480')
canvas = tkinter.Canvas(bg="white",width=800,height=600)
canvas.place(x=0,y=0)
im = ImageTk.PhotoImage(file='test.jpg')
canvas.create_image(200,200,image=im)
実行するとウィンドウ内に画像を表示。ちなみに画像「test.jpg」は「puthonproj」ディレクトリ内においています。
表示されない場合は画像ファイルの位置についても確認してみてください。
画像を切り替えてアニメーション
アニメーションでは一定時間ごとに画像を切り替えて表示したり、図形を書き直していく必要があります。
時間管理ではスレッドを利用することで定期的に処理を実行できます。
スレッドについては以下のサイトのスクリプトでうちでも動作を確認できました。
Python スレッドによる並行処理と終了の待ち合わせ、スレッド初期値の設定 - Symfoware
ここではスレッドを使って複数画像を切り替えてみます。
まだプログラムが冗長な気もしますが、以下のスクリプトで定期的に画像を切り替えて表示することができました。
import tkinter
from PIL import Image, ImageTk
import threading
import time
def funcLoop():global var
global canvas
var = var +1
if(var>2):
var =1
if(var == 1):
canvas.create_image(400,200,image=im1)
else:
canvas.create_image(400,200,image=im2)
t = threading.Timer(0.5, funcLoop)
t.start()
var = 1root = tkinter.Tk()
root.geometry('640x480')
canvas = tkinter.Canvas(bg="white")
canvas.place(x=0,y=0,relwidth=1.0,relheight=1.0)
im1 = ImageTk.PhotoImage(file='1.png')
im2 = ImageTk.PhotoImage(file='2.jpg')
funcLoop()
root.mainloop()
「AttributeError: module 'tkinter' has no attribute 'Tk'」?
実は最初、このエラーで全然ウィンドウが表示できませんでした。
ファイル名が「tinker.py」だと実行できないという書き込みがありました。確かにファイル名を「tinker.py」としていたので、ファイルを別名にして保存してみましたがまだだめです。
なんでだろー、なんでだろー、こわいなー、こわいなーと思っていたら、同ディレクトリに「tinker.py」は残っていたのを思い出し、「tinker.py」ファイルを削除したら無事動作しました。
「tinker.py」というファイルがあると、そちらを参照してしまってライブラリのほうへたどり着かないということだと思います。注意しましょう。
「_tkinter.tclerror couldn't recognize data in image file」?
ネットサイトで見つかるような「img = tkinter.PhotoImage(file="test.jpg")」という書き方を、「img = ImageTk.PhotoImage(file="test.jpg")」のようにしたらうちでは動作しました。
上述のスクリプトを参考ください。
主なエラー
エラーの場合、赤字でコンソールに情報が出ます。
これをもとに修正していきましょう。
AttributeError
Attributeは「属性」という意味です。
利用しているモジュールで用意されている命令に該当するものが見つからなかった場合におきます。
書き間違いがないか、あるいは利用しているモジュールのマニュアルをチェックしてみましょう。
特にモジュールではバージョンが変更されるとともに命令の書き方自体も変更している場合があります。
NameError
ネームエラーは、その名の通り名前が正しく書かれていない場合のエラーになります。
書き間違えがないか確認してみましょう。
「import」で必要なライブラリを利用可能にしていないとこのエラーになる場合もあります。
ModuleNotFound
importで宣言したモジュールが見つからなかったエラーです。
モジュールがあるかどうかは、例えばラズパイのコンソールで「pip list」のコマンドで一覧を確認したりするといいと思います。
SyntaxError
プログラムとしての記述が崩れているような場合。
例えば文字列の終端を閉じていないなど。
ZeroDivisionError
プログラミングエラーでは定番の「数字を0で割る」というエラーです。
こういうことのないように、割る数字が0でないかチェックをいれておくのがマナーです。