タイミングやイベント監視の問題がなくなったところで。
ちょっとアプリっぽいことをしてみましょう!
Raspberry Piのシステムにアクセスして、温度を取得してPyGameの画面に表示。
文字を表示するのとか基本中の基本なのに触れてこなかったですしね…
Pythonからシステムへアクセスするにはこんな感じでやります
import subprocess
tempture = "cat /sys/class/thermal/thermal_zone0/temp"
vTemp = subprocess.check_output(tempture, shell=True)
print(vTemp)
なーんだ、シェルでコマンド打つのと一緒じゃん。って思いました? その通りです。
気をつけないと行けないのは取得できた変数の中身が文字型になってるよってことでしょうかね。
型宣言がないので何かと詰まりがちな部分です。
つぎは文字の表示です。
なんで今まで触れなかったのかというと‥。
文字を画像にして画像を表示する、という仕組みなので、画像が表示出来てからじゃないと扱えなかった。
という理由に尽きます・・・。ややこしい。
必要な部分だけ抜粋するとこうなります。
フォントは選べるんですが、環境によって入ってるフォントが違うよとか、なんだかホームページ()が流行った時の話みたいなのが浮上してきます。とりあえず Noneを指定することでデフォルトのフォントが使える様なのでひとまずこれで。
myFont = pygame.font.Font(None,30)
textImage = myFont.render("Hello!",1,(255,255,255))
screen.blit(textImage,(100,100))
フォントを選択することと、そのフォントをつかって render することがキモになります。
render( 文字列, アンチエイリアスの有り無し(1:あり), RGBカラー )
と言うような形になっていますね。
というあたりをコードに反映したものがこちら。
import pygame, time, subprocess from pygame.locals import * #--------------------------------------------- # function start #--------------------------------------------- def polling( value ): global _running st = time.time() _procWait = True while(_procWait): for event in pygame.event.get(): if event.type == pygame.QUIT: _running = False if time.time() - st > value: _procWait = False def blink( value ): global screen, img1, img2, tempText screen.fill( (50,50,50) ) screen.blit(tempText,(48,89)) if( value == 1 ): screen.blit(img1,(14,83)) else: screen.blit(img2,(14,83)) pygame.display.update() #--------------------------------------------- # function end #--------------------------------------------- _running = True _size = ( 320,200 ) _mode = pygame.HWSURFACE | pygame.DOUBLEBUF pygame.init() screen = pygame.display.set_mode(_size,_mode) pygame.display.set_caption("hello pygame") myFont = pygame.font.Font(None,30) img1 = pygame.image.load("./bluedot.png").convert_alpha() img2 = pygame.image.load("./glaydot.png").convert_alpha() tempture = "cat /sys/class/thermal/thermal_zone0/temp" while(_running): vTemp = subprocess.check_output(tempture, shell=True) vTemp = int(vTemp) / 1000.0 tempText = myFont.render("Temp: " + str(vTemp),1,(255,255,255)) blink(1) polling(0.2) blink(0) polling(0.2) pygame.quit()
実行するとこんな感じになります。
んープログラムらしくなってきた?
プログラム中1000.0っていう表現が出てきますね?
1000じゃダメなのか、というはなしなんですが、Pythonはどこかのステップで書いたように型の宣言がないので入ってきたデータによって型を変えます。整数÷整数 した結果がいくら小数点付きの数値であっても、計算中に小数点が出てこなければ答えは整数になります。 (うあー)
ので、計算する際に、答えが小数点付きの数値で欲しいなら、小数点付きの数値で計算してやる必要があるというわけです。
なんじゃそりゃーって感じですがなれてしまえばそんなに気にはならない…かな。