Python
Pythonのインスタンス変数
by kewi on 11 月.22, 2009, under Python
うーん、よくわかりません。
from Tkinter import *
#Raw Data and Feature Data
class SensorData :
#Sensor Data
DataList = []
DataMaxSize = 0
DataDefault = 450
#Widget
Data = ""
GraphWidth = 100
GraphHeight = 50
#print Data
def printData(self) :
print self.DataList[len(self.DataList)-1]
self.Data.set(str(self.DataList[len(self.DataList)-1]))
#draw Graph (for GUI)
def drawDataGraph(self, _Color) :
graph = Canvas(self.Frame, width=self.GraphWidth, height=self.GraphHeight)
graph.create_line([(i*2, (self.DataList[i]-450)/4+25) for i in range(0, len(self.DataList))], fill=_Color, width=1.5)
graph.grid(row=self.DataLabelRow, column=2)
#append DataList
def appendData(self, _Data):
self.DataList.append(_Data)
if len(self.DataList) > self.DataMaxSize :
self.DataList.pop(0)
print self.DataList
#pack Widget (for GUI)
def packWidget(self, _Frame, _Row, _Font) :
self.Frame = _Frame
self.DataLabelRow = _Row
self.Data = StringVar()
Label(_Frame, text=self.DataName+" :").grid(row=_Row, column=0, padx=self.Padx, pady=self.Pady)
self.DataLabel = Label(_Frame, textvariable=self.Data, font=_Font, width = 10)
self.DataLabel.grid(row=_Row, column=1, padx=5, pady=5)
self.Data.set(str(0))
def __init__ (self, _Name, _Length, _Position, _MaxSize) :
self.DataName = _Name
self.DataLength = _Length
self.DataPosition = _Position
self.DataMaxSize = _MaxSize
class DataCalcurator :
#Data
RawData = []
RawDataName =[]
DataMaxSize = 0
#Widget
RawDataFrame = ""
GraphColor = ["red","green","blue","yellow","orange","gray"]
#print All Raw Data
def printRawData(self):
for i in range(0,len(self.RawData)) :
self.RawData[i].printData()
#Draw Raw DataGraph
def drawRawDataGraph(self) :
for i in range(0, len(self.RawData)) :
self.RawData[i].drawDataGraph(self.GraphColor[i%len(self.GraphColor)])
#Set All Raw Data
def setRawData(self, _Data) :
for i in range(0, len(self.RawData)) :
self.RawData[i].setData(_Data)
#pack Widget
def packWidget(self, _Frame, _Font) :
#Raw Data
self.RawDataFrame = LabelFrame(_Frame, text="Raw Data")
self.RawDataFrame.grid(row=0, column=0, columnspan=1, padx=5, pady=5, sticky=W + E + N + S)
for i in range(0, len(self.RawData)) :
self.RawData[i].packWidget(self.RawDataFrame, i, _Font)
def __init__(self, _RawDataName, _SerialDataList, _DataMaxSize) :
self.RawDataName = _RawDataName
self.DataMaxSize = _DataMaxSize
for i in range(0, len(_RawDataName)) :
AppendData = SensorData(_RawDataName[i], 2, (11+(i*2)), _DataMaxSize)
self.RawData.append(AppendData)
class Main :
#Frames
SensorData = ""
SerialConnector = ""
def packWidget(self, _Title) :
##### MAIN WINDOW #####
root = Tk()
root.title(_Title)
##### sensordata frame #####
sensordataFrame = LabelFrame(root, text="Data")
sensordataFrame.grid(row=0, column=0, padx=5, pady=5, sticky=N + W)
self.SensorData.packWidget(sensordataFrame, "courier 12")
return root
def setData(self) :
while True :
if len(self.SerialDatalist) :
self.SensorData.setRawData(self.SerialDatalist.pop(0))
if GUI_APPLICATION_FLAG :
self.SensorData.printRawData()
self.SensorData.drawRawDataGraph()
else :
time.sleep(0.1) #tmp
def __init__(self) :
#Sensor Data
self.SensorData = DataCalcurator(RAW_DATA_NAME, FEATURE_DATA_NAME, SERIAL_DATA_LIST, DATA_MAXSIZE, SERIAL_DATA_OFFSET)
####################
###### MAIN ######
####################
def main() :
#GUI APP Flag
global GUI_APPLICATION_FLAG
GUI_APPLICATION_FLAG = True
X = Main()
root = X.packWidget("テスト")
root.mainloop();
if __name__ == '__main__':
main()
色々抜けてるけどこんな感じで、
class SensorData
のインスタンスをいっぱいつくって、それぞれの
DataList = []
にデータを追加していきたい。そして、
printData
と
drawDataGraph
でデータとグラフを表示させたい。
でも、これだと作ったインスタンスがすべて同じ
DataList
のアドレスを参照してしまうみたいで、全部同じ値になってしまう。
調べてたら、
http://d.hatena.ne.jp/smeghead/20080414/ooppy
をみつけたので、DataListをそれぞれ__init__で再定義すればよいのかと思って
from Tkinter import *
#Raw Data and Feature Data
class SensorData :
#Sensor Data
DataList = []
DataMaxSize = 0
DataDefault = 450
#Widget
Data = ""
GraphWidth = 100
GraphHeight = 50
#print Data
def printData(self) :
print self.DataList[len(self.DataList)-1]
self.Data.set(str(self.DataList[len(self.DataList)-1]))
#draw Graph (for GUI)
def drawDataGraph(self, _Color) :
graph = Canvas(self.Frame, width=self.GraphWidth, height=self.GraphHeight)
graph.create_line([(i*2, (self.DataList[i]-450)/4+25) for i in range(0, len(self.DataList))], fill=_Color, width=1.5)
graph.grid(row=self.DataLabelRow, column=2)
#append DataList
def appendData(self, _Data):
self.DataList.append(_Data)
if len(self.DataList) > self.DataMaxSize :
self.DataList.pop(0)
print self.DataList
#pack Widget (for GUI)
def packWidget(self, _Frame, _Row, _Font) :
self.Frame = _Frame
self.DataLabelRow = _Row
self.Data = StringVar()
Label(_Frame, text=self.DataName+" :").grid(row=_Row, column=0, padx=self.Padx, pady=self.Pady)
self.DataLabel = Label(_Frame, textvariable=self.Data, font=_Font, width = 10)
self.DataLabel.grid(row=_Row, column=1, padx=5, pady=5)
self.Data.set(str(0))
def __init__ (self, _Name, _Length, _Position, _MaxSize) :
self.DataName = _Name
self.DataLength = _Length
self.DataPosition = _Position
self.DataMaxSize = _MaxSize
self.DataList = [] ##### 追加 #####
class DataCalcurator :
#Data
RawData = []
RawDataName =[]
DataMaxSize = 0
#Widget
RawDataFrame = ""
GraphColor = ["red","green","blue","yellow","orange","gray"]
#print All Raw Data
def printRawData(self):
for i in range(0,len(self.RawData)) :
self.RawData[i].printData()
#Draw Raw DataGraph
def drawRawDataGraph(self) :
for i in range(0, len(self.RawData)) :
self.RawData[i].drawDataGraph(self.GraphColor[i%len(self.GraphColor)])
#Set All Raw Data
def setRawData(self, _Data) :
for i in range(0, len(self.RawData)) :
self.RawData[i].setData(_Data)
#pack Widget
def packWidget(self, _Frame, _Font) :
#Raw Data
self.RawDataFrame = LabelFrame(_Frame, text="Raw Data")
self.RawDataFrame.grid(row=0, column=0, columnspan=1, padx=5, pady=5, sticky=W + E + N + S)
for i in range(0, len(self.RawData)) :
self.RawData[i].packWidget(self.RawDataFrame, i, _Font)
def __init__(self, _RawDataName, _SerialDataList, _DataMaxSize) :
self.RawDataName = _RawDataName
self.DataMaxSize = _DataMaxSize
for i in range(0, len(_RawDataName)) :
AppendData = SensorData(_RawDataName[i], 2, (11+(i*2)), _DataMaxSize)
self.RawData.append(AppendData)
class Main :
#Frames
SensorData = ""
SerialConnector = ""
def packWidget(self, _Title) :
##### MAIN WINDOW #####
root = Tk()
root.title(_Title)
##### sensordata frame #####
sensordataFrame = LabelFrame(root, text="Data")
sensordataFrame.grid(row=0, column=0, padx=5, pady=5, sticky=N + W)
self.SensorData.packWidget(sensordataFrame, "courier 12")
return root
def setData(self) :
while True :
if len(self.SerialDatalist) :
self.SensorData.setRawData(self.SerialDatalist.pop(0))
if GUI_APPLICATION_FLAG :
self.SensorData.printRawData()
self.SensorData.drawRawDataGraph()
else :
time.sleep(0.1) #tmp
def __init__(self) :
#Sensor Data
self.SensorData = DataCalcurator(RAW_DATA_NAME, FEATURE_DATA_NAME, SERIAL_DATA_LIST, DATA_MAXSIZE, SERIAL_DATA_OFFSET)
####################
###### MAIN ######
####################
def main() :
#GUI APP Flag
global GUI_APPLICATION_FLAG
GUI_APPLICATION_FLAG = True
X = Main()
root = X.packWidget("テスト")
root.mainloop();
if __name__ == '__main__':
main()
こんな風にしてみると、DataListはそれぞれのものを参照するみたいで
printData
は上手くいった。
でも
drawDataGraph
でエラーが出てくるようになってしまった…うーむ。
→グラフのデータがない状態でのエラーで、2つ以上の点を読むようにすればいけました。どうやってグラフ書けって話だよね、当然ですな…。
threadからDialog
by kewi on 10 月.28, 2009, under Python
Python のスレッドからダイアログを呼ぶとエラーを起こす気がする。
というかTkinterとかのGUI扱うやつもかな?
そんな気がするのでメモ。
C/C++からPythonの呼び出し
by kewi on 10 月.22, 2009, under Python, Study
環境は、ミングー+Windows用のPython2.5
- Pythonインタプリタの拡張と埋め込み
http://www.python.jp/doc/nightly/ext/ext.html - Python / C API リファレンスマニュアル
http://www.python.jp/doc/release/api/api.html - C言語アプリケーションにPythonを組み込む
http://d.hatena.ne.jp/Wacky/20060103/1136292735 - Python拡張の作り方
http://labs.cybozu.co.jp/blog/nishio/2007/06/python.html - [技][ぷ]distutils with boost.python
http://d.hatena.ne.jp/earth2001y/20070611/p1
C→Pythonが多いけども。
いろいろいじくってみるも、できない、できない。死にたい。
でも、
#include <C:\Python25\include\Python.h>
int main(void)
{
Py_Initialize();
PyRun_SimpleString("mystring = \"Hello World from Python\"");
PyRun_SimpleString("print mystring");
Py_Finalize();
return 0;
}
こいつをtest.cとして
gcc test.c -lm C:\Python25\libs\python25.lib
…あら、なんか通った。
a.exe Hello World from Python
なんかうまく動いてる!?これでいいのか?
PythonでSkypeを弄ぶ
by kewi on 10 月.21, 2009, under Memo, Python, Study
研究室に来たり帰ったりしたときに、Skypeのムードメッセージとかを自動的に変えたいなー。
と思ったら、Python用のAPIがあった。
https://developer.skype.com/wiki/Skype4Py
リファレンス:http://skype4py.sourceforge.net/doc/html/
2.4~3未満がサポートされてるっぽい。
うちのPythonはMySQLのライブラリを手間無く入れるために2.5を入れてるので、問題ない。
リファレンスみてみるといろいろあって面白そう。
ムードメッセージを変えたかったらこんな感じ。
#! /usr/bin/python # -*- coding: utf-8 -*- import Skype4Py skype = Skype4Py.Skype() profile = skype._GetCurrentUserProfile() print profile.MoodText profile._SetMoodText(u"@研究室") print profile.MoodText
でもSkype()のインスタンスは今立ち上がってるSkypeのユーザのものがくるっぽい。
Skype立ち上げてなかったらなにも返ってこない。
ユーザIDとパスワード指定する形がよかったのに…。
使うときはパイプで開いて閉じてみたいな感じにしてみようか。ダメかな。
#! /usr/bin/python # -*- coding: utf-8 -*- import Skype4Py import twitter def readMessageFromTwitter(user, password) : api = twitter.Api(user,password) US = api.GetUser(user) ST = US.GetStatus() return ST.GetText() + " by Twitter" skype = Skype4Py.Skype() profile = skype._GetCurrentUserProfile() profile._SetFullName(u"kewi@研究室") profile._SetMoodText(readMessageFromTwitter(User_ID, PASSWORD))
名前を変更して、Twitterの最新メッセージにムードメッセージを変更するスクリプト。
これを出席アプリに組み込んで…むふふ。
Pythonでシリアルポートからデータ読み出し
by kewi on 10 月.15, 2009, under Python, Study
Python(http://www.python.org/download/)
でのシリアルデータの扱い方。
pySerial(http://pyserial.sourceforge.net/)を使えばいいらしい。
ちょろっとコード書いてみる。
import serial ser=serial.Serial(3,115200,timeout=0) #シリアルポートにアクセス data = ser.read(20) #データを読み込む(20バイト分) if len(data) != 0 : print data #データを表示 ser.close() #接続を閉じる
こんな感じでちゃっと読めます。
でもきちんとcloseしないと、もう一回繋ごうとしたときにはじかれたりします。
そんなときはXSnifferとかTera Termとかでそのポートを開いて閉じれば、復活したりします。
それでもダメなら、放っておいたら勝手に復活したりします。
なんでかはわかりません。