なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

wxPythonのpiectrlを使ってみた

久しぶりにwxPythonのデモをみているとpiectrlなるものがあった。
piectrlは円グラフを書くためのモジュールで、これを使えば円グラフが簡単に書けるっぽい。

ということで、デモのコードやらをみて書いてみた。
たいしたコードではないが日本語で紹介しているサイトが
パッと見てなかったので一応掲載する。

まずは実行時のキャプチャ

piectrl

なかなか便利そうですよね?

以下コード


#coding:utf8
from wx.lib.agw.piectrl import *
import wx

app = wx.App()
frame = wx.Frame(None,-1,"Pie Test",size=(300,400))

mypie = PieCtrl(frame, -1, wx.DefaultPosition, wx.Size(180,270))

#GetLegendで円グラフに記入する文字に関する設定をする
mypie.GetLegend().SetTransparent(True)
mypie.GetLegend().SetHorizontalBorder(10)
mypie.GetLegend().SetWindowStyle(wx.STATIC_BORDER)
mypie.GetLegend().SetLabelFont(wx.Font(10, wx.FONTFAMILY_DEFAULT,
wx.FONTSTYLE_NORMAL,
wx.FONTWEIGHT_NORMAL,
False, "Courier New"))
#円グラフの高さを設定
mypie.SetHeight(30)
#円グラフのエッジ表示を消す
mypie.SetShowEdges(False)
#円グラフの「A]の部分を追加する
part = PiePart()
part.SetLabel("A")
part.SetValue(300)
part.SetColour(wx.Colour(200, 50, 50))
mypie._series.append(part)
#円グラフの「B]の部分を追加する
part = PiePart()
part.SetLabel("B")
part.SetValue(200)
part.SetColour(wx.Colour(50, 200, 50))
mypie._series.append(part)
#円グラフの「C]の部分を追加する
part = PiePart()
part.SetLabel("C")
part.SetValue(50)
part.SetColour(wx.Colour(50, 50, 200))
mypie._series.append(part)

frame.Show()
app.MainLoop()

スポンサーサイト

自炊した書籍のアーカイブのファイルを整理するツールをとりあえず作った

えーと、何を作ったかといえば、最近流行っている電子書籍化による自炊。
それでよく.zipとかで圧縮してまとめてるんだけど、まとめたアーカイブでいつも見ないページがあるわけ。でその部分を削除したいと思う訳だけど、削除するためにはまずzipを解凍して、解凍したフォルダから必要なページだけ選び出してまたzipに圧縮するという作業を私はする訳です。
 しかし、既に勢いで結構な数の電子書籍を自炊してしまいいちいちこの作業をするのが煩わしくなったのでこの作業の補助ツールをPythonで書いてみた。"とりあえずうごけばいい"の設計思想で書いたので非常に読みにくくなっているがとりあえず掲載しておく。

使い方は後述するコードをコピペした2つのファイルを同じ階層のフォルダに保存して使用。
あとは直感で使えるはず。フォルダのドラッグ&ドロップに対応しています!

ぶっちゃけこの説明よんだだけだとなんだか分からないと思うのでまた後日詳しく説明したいと思います。とりあえず今回はバックアップが主な目的です。
ただし、wxpythonのListBox(リストボックス)とドラッグ&ドロップによるファイルパスの取得の仕方の参考には多少なると思われます。


#coding:utf-8

"""
rebook.py
"""
import wx
import os
import glob,shutil
import zipfile
import dragdrop

TEMPDIR = "tmp"

class MainWindow(wx.Frame):
def __init__(self, parent, title):
global fileList,startStr,endStr
self.dirname=''

# A "-1" in the size parameter instructs wxWidgets to use the default size.
# In this case, we select 200px width and the default height.
wx.Frame.__init__(self, parent, title=title, size=(200,-1))
self.fileList = wx.ListBox(self,26,wx.DefaultPosition,(370,500),flist,wx.LB_SINGLE)
fileList = self.fileList
self.fileList.Bind(wx.EVT_LISTBOX_DCLICK,self.dclickList)
self.CreateStatusBar() # A Statusbar in the bottom of the window

self.startStr = wx.StaticText(self,-1,"Start:")
self.startStr.SetForegroundColour("red")
startStr = self.startStr
self.endStr = wx.StaticText(self,-1,"End:")
self.endStr.SetForegroundColour("red")
endStr = self.endStr

# Setting up the menu.
filemenu= wx.Menu()
menuOpen = filemenu.Append(wx.ID_OPEN, "&Open\tCtrl+O"," Open a file to edit")
menuAbout= filemenu.Append(wx.ID_ABOUT, "&About"," Information about this program")
menuExit = filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program")

# Creating the menubar.
menuBar = wx.MenuBar()
menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
self.SetMenuBar(menuBar) # Adding the MenuBar to the Frame content.

# Events.
self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen)
self.Bind(wx.EVT_MENU, self.OnExit, menuExit)
self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout)

dropTarget = dragdrop.FileDropTarget(self.fileList,self)
self.fileList.SetDropTarget(dropTarget)


self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
self.sizer3 = wx.BoxSizer(wx.HORIZONTAL)

self.buttonStart = wx.Button(self,label=u"開始ページ指定")
self.buttonEnd = wx.Button(self,label=u"終了ページ指定")
self.buttonCancel = wx.Button(self,label=u"指定取り消し")
self.buttonZip = wx.Button(self,label=u"圧縮開始")
self.buttonFree = wx.Button(self,label=u"フォルダ選択解除")
self.buttonDelete = wx.Button(self,label=u"削除")
self.sizer2.Add(self.buttonStart,1,wx.EXPAND)
self.sizer2.Add(self.buttonEnd,1,wx.EXPAND)
self.sizer2.Add(self.buttonCancel,1,wx.EXPAND)
self.sizer2.Add(self.buttonZip,1,wx.EXPAND)
self.sizer3.Add(self.buttonFree,1,wx.EXPAND)
self.sizer3.Add(self.buttonDelete,1,wx.EXPAND)
self.buttonStart.Bind(wx.EVT_BUTTON,self.selectStart)
self.buttonEnd.Bind(wx.EVT_BUTTON,self.selectEnd)
self.buttonCancel.Bind(wx.EVT_BUTTON,self.selectCancel)
self.buttonZip.Bind(wx.EVT_BUTTON,self.selectZip)
self.buttonFree.Bind(wx.EVT_BUTTON,self.selectFree)
self.buttonDelete.Bind(wx.EVT_BUTTON,self.selectDelete)


# Use some sizers to see layout options
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.fileList, 1, wx.EXPAND)
self.sizer.Add(self.sizer2, 0, wx.EXPAND)
self.sizer.Add(self.sizer3, 0, wx.EXPAND)
self.sizer.Add(self.startStr, 0, wx.EXPAND)
self.sizer.Add(self.endStr, 0, wx.EXPAND)

#Layout sizers
self.SetSizer(self.sizer)
self.SetAutoLayout(1)
self.sizer.Fit(self)
self.Centre()
self.Show()

def decodeStr(self,list):
ret = []
for name in list:
ret.append(name.decode("cp932"))
return ret

def OnAbout(self,e):
# Create a message dialog box
dlg = wx.MessageDialog(self, " A sample editor \n in wxPython", "About Sample Editor", wx.OK)
dlg.ShowModal() # Shows it
dlg.Destroy() # finally destroy it when finished.

def OnExit(self,e):
self.Close(True) # Close the frame.

def OnOpen(self,e):
global dirPath,flist,startPath,endPath
""" Open a file"""
dlg = wx.DirDialog(self, "Choose a folder",style=wx.DD_DEFAULT_STYLE)
if dirPath is not None:
dlg.SetPath(dirPath)
if dlg.ShowModal() == wx.ID_OK:
dirPath = dlg.GetPath()
print dirPath
#os.chdir(dirPath)
flist = glob.glob(os.path.join(dirPath,"*"))
basenames = []
for name in flist:
basenames.append(os.path.basename(name))
fileList.Set(basenames)
startPath = None
endPath = None

dlg.Destroy()

def setDropedList(self,path):
global dirPath,flist,startPath,endPath
if not os.path.isdir(path):
print "this is not direcotry!!"
return

dirPath = path
print dirPath
#os.chdir(dirPath)
flist = glob.glob(os.path.join(dirPath,"*"))
basenames = []
for name in flist:
basenames.append(os.path.basename(name))
fileList.Set(basenames)
startPath = None
endPath = None


def selectStart(self,e):
global startPath,startIndex
print flist[fileList.GetSelections()[0]]
startIndex = fileList.GetSelections()[0]
startPath = flist[fileList.GetSelections()[0]]
startStr.SetLabel("start: " + startPath)
def selectEnd(self,e):
global endPath,endIndex
print flist[fileList.GetSelections()[0]]
endIndex = fileList.GetSelections()[0]
endPath = flist[fileList.GetSelections()[0]]
endStr.SetLabel("end: " + endPath)
def selectCancel(self,e):
global startPath,endPath,startIndex,endIndex
startStr.SetLabel("start: ")
endStr.SetLabel("end: ")
startPath = None
endPath = None
startIndex = None
endIndex = None
def selectZip(self,e):
global flist,trimelist,endPath,endIndex,startPath,startIndex
if startPath is None and endPath is None:
endIndex = len(flist)-1
endPath = flist[endIndex]
startIndex = 0
startPath = flist[0]

if startPath is None or endPath is None:
print"choose files"
return
dialog = wx.FileDialog(self,"choose save place",wildcard="*.zip",style=wx.SAVE)
if dialog.ShowModal() == wx.ID_OK:
print dialog.GetPath()
else:
return
trimelist = flist[startIndex:endIndex+1]
zip = zipfile.ZipFile(dialog.GetPath(),"w",zipfile.ZIP_DEFLATED)
for f in trimelist:
if not os.path.isfile(f) :continue
print os.path.basename(f)
zip.write(f,os.path.basename(f).encode("cp932"))
zip.close()
print "zipping was end"
self.selectCancel(None)

def selectFree(self,e):
global dirPath
global fileList
dirPath = None
fileList.Set([""])

def dclickList(self,e):
print fileList.GetSelections()[0]
self.fileList.SetItemBackgroundColour(fileList.GetSelections()[0],wx.Colour(0,255,255))
self.fileList.Refresh()
print "dclicked"

def selectDelete(self,e):
global dirPath
if dirPath is None :
return
dlg = wx.MessageDialog(self,dirPath+u"\n\nを本当に削除しますか?",u"確認",wx.OK|wx.CANCEL|wx.ICON_QUESTION)
result = dlg.ShowModal()
if result == wx.ID_OK :
print "run"
shutil.rmtree(dirPath)
dirPath = None
fileList.Set([""])
else:
print "canceled"


startIndex = None
endIndex = None
startPath = None
endPath = None
startStr = None
endStr = None

fileList = None
flist = []
trimelist = []
dirPath = None
app = wx.App(False)
frame = MainWindow(None, u"ページピッカー(仮名)")
app.MainLoop()




import wx
"""
dragdrop.py
"""
class FileDropTarget(wx.FileDropTarget):
""" This object implements Drop Target functionality for Files """
def __init__(self, obj,parent):
# Initialize the wxFileDropTarget Object
wx.FileDropTarget.__init__(self)
# Store the Object Reference for dropped files
self.obj = obj
self.parent = parent

def OnDropFiles(self, x, y, filenames):
""" Implement File Drop """
if len(filenames) is not 1:
print "Please drop a directory"
return
self.parent.setDropedList(filenames[0])





python twitter モジュールを使ってハッシュタグ検索したい2

昨日の続き。
やっぱりtwitter.pyだとハッシュタグ検索が難しいみたいなので、とりあえずこのモジュールは使わない方針に
切り替える。

それでもtwitter APIは使いやすいので簡単にコードが書けた。苦労したのはjsonフォーマットの文字列の処理。
そもそもjsonなんか扱ったことなかったが、ただの文字情報フォーマットでしかなく、jsonモジュールを使って
変換するとpythonのデータ型に変換できる。まあ、その変換したデータからツイートの文字列だけをとりだすのに苦労したが…

以下、指定したハッシュタグを含むつぶやきを最大100件表示するコード。
ただし、あまり古いつぶやきが検索にかからなくなっているので全てのつぶやきを
取得できるわけではないことに注意。

import urllib,json

d = urllib.urlopen("http://search.twitter.com/search.json?q=%23☆ここにタグ名を入れる☆&since=2011-01-20&rpp=100")
r = d.read().decode("utf-8")
l = json.loads(r)
for s in l["results"]:
print s["text"]


urlでの引数の指定によって結果を変えられる。

sinceは指定した日付以降のつぶやきのみを表示
rppは取得するつぶやきの件数(最大100件らしいが未確認)
他にもuntilとかいう引数もある。詳しくはtwitter APIを参照されたし。

あと、同じくURLの %23 は # を表しているものだと思われる。

以上。

python twitter モジュールを使ってハッシュタグ検索したい

twitter apiを簡単にpythonで扱うことのできるモジュールがあるんだけど
いまいちハッシュタグ検索のやりかたがわからない、というか調べているうちに
できないような気もしてきたのだが…

とりあえず完全にではないがそれっぽいことができたのでメモメモ。

実行環境はWindows Vista

まずtwitterモジュールを使うためにダウンロードしてきてインストールしてこないといけないんだけど
twitterモジュールのほかに依存するモジュールが2,3個あるのでそれもインストールすること
依存モジュールはtwitterモージュールをおいてるページにリンクを書いてくれてるのでそれを参考に。

私はここで少しハマッてしまった。依存モジュールをインストールするときに不安定版のモジュールを入れてしまい
import twitter でエラーがでてしばらく困った。もちろん安定版の依存モジュールをいれてやればうまくいった。


このtwitterモジュールはかなり使いやすく、今回のハッシュタグ検索っぽいことをして結果をファイルに書き出すだけの作業だとかなり簡潔に書けてします。以下今回書いたコード


import twitter

w = open("text.txt","w")
api = twitter.Api()
result = api.GetSearch("#1000yen")
for s in result:
w.write(s.text.encode("cp932")+"\n")




以下は出力されてたファイル


1.23.16.32 モントレ一階の自販機でドリンコ。 MY343135N 1.21.19:03 渋谷の東急中にある蜂蜜屋さんラベイユで蜂蜜買う。 #1000yen
01.21.20時頃 渋谷の仙台やでご飯。 MY343133N 1.21.19:03 渋谷の東急中にある蜂蜜屋さんラベイユで蜂蜜買う。 #1000yen
kw861168a 2011/1/19 18:30ころ。立川のheartbeatでcornersのライブを見るのと引き換えに手放す。これは、2011/1/14 17:00山梨信用金庫でおろしたもの。 #1000yen


うーん。少し結果がおかしいが今日はこのへんで切り上げるとする。


シティバンクのオンライン口座作成手続きのメモ

前回のドルを受け取るはなしで小額,800ドル程度までならシティバンクを利用すると
あまり手数料がかからずに円として手元に持てることをかいた.

今回はシティバンク口座開設時のメモを残しておく

シティバンクの口座開設手続きはインターネットでほとんどできてしまう.
本人確認も保険証等の書類をスキャナやデジカメで撮って送信するので銀行にいく必要が無い.

インターネットによって登録手続きが完了すると,バンキングカードとサインカードと
呼ばれるものが銀行から送られてくるのでそれに自筆でサインして送り返しそれが受理されれば
手続き完了.というふうに簡単に口座の開設ができる.(口座開設の仕方が変わる可能性があるので詳しくはシティバンクのホームページで調べてください)

送られてくるバンキングカードはATMで円の引き出し,預金はできるようだがドルに関しては残高参照もできない.
 ドルの残高はシティバンクのホームページからログインして調べることができる.


そういえば,手続きの手順のところには記述しなかったけど,手続き期間中に銀行から何か不明な点がないかという電話があった.多分電話番号の確認も兼ねているんだと思う.

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。