kewiii

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つ以上の点を読むようにすればいけました。どうやってグラフ書けって話だよね、当然ですな…。

Leave a Comment more...

threadからDialog

by kewi on 10 月.28, 2009, under Python

Python のスレッドからダイアログを呼ぶとエラーを起こす気がする。
というかTkinterとかのGUI扱うやつもかな?
そんな気がするのでメモ。

Leave a Comment more...

C/C++からPythonの呼び出し

by kewi on 10 月.22, 2009, under Python, Study

環境は、ミングー+Windows用のPython2.5

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

なんかうまく動いてる!?これでいいのか?

Leave a Comment more...

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の最新メッセージにムードメッセージを変更するスクリプト。
これを出席アプリに組み込んで…むふふ。

Leave a Comment more...

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とかでそのポートを開いて閉じれば、復活したりします。
それでもダメなら、放っておいたら勝手に復活したりします。
なんでかはわかりません。

Leave a Comment more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...