全8件 (8件中 1-8件目)
1
Raspberry Pi 用 PoE基板があればイーサネットケーブルから電源供給できるから電源を気にしなくて済むようになる。あちこちしかけるのにちょうどいい。とはいえ、Raspberry Pi 本体と合わせて 1万円ぐらいになっちゃうけど。無線LANの AP をつくるかな。これにセンサーをつけたり、カメラをつけて防犯カメラとかにするとか、いろいろできそう。そういえば、まだカメラをつけてあれこれしてなかった。
2015.03.25
コメント(0)
![]()
処理したいファイルを GUI で選んで、何かするというのは、よく使うと思うので書いておく。ファイルを選択するには、GetFile(directory='', filename='', multiple=False, wildcard='All Files (*.*)|*.*', title="Select file(s)")multiple=False だと、1つのファイルだけ選択でき、multiple=True だと複数ファイルを選択でき、リストが返される。ディレクトリを選択したいときは、GetDir(path="", title='Select a directory')保存したいときは、SetFile(directory='', filename='', overwrite=False, wildcard='All Files (*.*)|*.*', title="保存する"):例えば、こうやって、ファイルを選択する。1つの場合と、複数の場合を試す。加えて、*.py だけ対象にするとかフィルタをかけられるのでやってみる。# -*- coding: utf-8 -*-import quickgui as qfilename = q.getfile(directory='/etc', multiple=False, wildcard='All Files (*.*)|*.*', title="ファイルを選択してください")print(filename)filename = q.getfile(directory='.', multiple=True, wildcard='Python sources (*.py)|*.py', title="ファイルを選択してください")print(filename)/etc を指定して、開いたところ。カレントディレクトリを指定して開いたところ。/etc/ntp.conf[u'/home/kafka/work/quickgui/sample103.py']
2015.03.23
コメント(0)
以前、Python のファイル参照や操作は面倒だというあなたに path モジュール という記事を書いた。標準ライブラリの os.path はイマイチ使いにくい。Python を使ってディレクトリやファイルをたどりながら何かするのは面倒。たとえば、このディレクトリの下のファイル名が「~」で終わっているファイルを削除したいとかいうのを書こうとすると、unix だったら find コマンドを使って、find . -name \*~ -print -exec rm {} \; とかあるわけで、そんな風にもっと簡単にできないかなぁと思う人も多いだろう。で、path モジュールを使えば、この手のものも簡単に書けるようになる。path だと、import pathd = '/var/apache/htdocs'for f in d.walkfiles('*~'): f.removeのような書き方ができた。ちなみに、os.path (python 2) を見ると os.path.walk があるが os.path (python 3) にはない。os.walk が残っている。python 3 では、pathlib — オブジェクト指向のファイルシステムパス が追加されているが、やっぱりもっと直感的に使えるようなものが欲しい。そこで、pyfs の登場となる。"pip install pyfs" でインストール。import fstarget_path = /var/apache/htdocs# 一ファイルずつ削除for f in fs.find('*~', target_path): fs.rm(f)# あるいは、まとめて削除to_delete = fs.find('*~', target_path)fs.rmfiles( to_delete )path や pathlib のようにファイルパスをオブジェクトとして、それを使って操作するという感じではなく、直接的に UNIX のコマンドのような感じで操作できる。ということで、気に入ってしまった。ソースを見てみればわかるが、かなりの部分が os.path や os をラップしているだけなので、基本を覚えるのは簡単。fs.exists(path) : os.path.exists(path)fs.isfile(path) : os.path.isfile(path)fs.rename(oldPath, NewPath, **kwargs) : os.rename(oldPath, newPath, **kwargs)fs.chdir(path, **kwargs) : os.chdir(path, **kwargs)fs.stat(path) : os.stat(path)fs.ctime(path) : os.stat(path).st_ctimefs.atime(path) : os.stat(path).st_atimefs.mtime(path) : os.stat(path).st_mtimefs.abspath(path, **kwargs) : os.path.abspath(path, **kwargs)fs.normalize(path, **kwargs) : os.path.normpath(path, **kwargs)fs.rm(path, **kwargs) : os.unlink(path, **kwargs)fs.unlink(*args, **kwargs) : os.unlink(path, **kwargs)fs.rmdir(path, recursive=True, **kwargs) : shutil.rmtree(path, **kwargs)fs.rmfiles(paths, **kwargs) : os.unlink(path, **kwargs)fs.exists(path, **kwargs) : os.path.exists(path, **kwargs)fs.cwd() : os.getcwd()fs.basename(path, ext="") : os.path.basename(path).replace(ext, "")fs.dirname(path) : os.path.dirname(path)fs.sep : os.path.sepこれらに加えて、fs.truncate(path, **kwargs) : path 以下のすべてのファイルとディレクトリを削除fs.rmdir(path, recursive=True, **kwargs) : path のディレクトリを削除 (再帰的に削除は、recursive=True を指定。 os.rmdir か os.rmtree で削除している)fs.rmfiles(paths, **kwargs) : リストで渡されたファイルを削除fs.rmdirs(paths, **kwargs) : リストで渡されたディレクトリを削除fs.mkdir(path, recursive=True, **kwargs) : Unix コマンドの mkdir と同じ。 recursive=True で、mkdirsfs.touch(path) : Unix のタッチコマンドと同じ。fs.list(path='.') : os.listdir(path) の結果を isfile して ファイルだけ残して、iterable にしている。fs.listdirs(path='.') : os.listdir(path) の結果を isdir して ディレクトリだけ残してiterable にしている。fs.find(pattern, path='.', exclude=None, recursive=True) : パターンに指定されたファイルを iterable に返す。 exclude で除外ディレクトリも指定できる。再帰的適応も可。 os.walk で走査して、fnmatch.filter でフィルタしている。fs.finddirs(pattern, path='.', exclude=None, recursive=True) : find のディレクトリ版。fs.join(*args, **kwargs) : os.path.join(*args, **kwargs) と同じ。 +リストで引数を渡すことができる。fs.extname(path, **kwargs) : name, ext = os.path.splitext(path, **kwargs) の ext を返す。fs.open(path, mode='r', **kwargs) : 標準の open(path, mode, **kwargs)fs.write(path, content, encoding="UTF-8", append=False, raw=False) : 標準の open を使ってエンコード指定で書き込む。fs.read(path, encoding="UTF-8") : 標準の open を使って、エンコード指定で読み込む。fs.append(*args, **kwargs) : fs.write(*args, append=True, **kwargs)fs.get(*args, **kwargs) : fs.read(*args, **kwargs)fs.put(*args, **kwargs) : fs.write(*args, **kwargs)fs.filename(*args, **kwargs) : fs.basename(*args, **kwargs)fs.extension(*args, **kwargs) : fs.extname(*args, **kwargs)要するに、a pythonic file system wrapper for humansAn easy to use file system wrapper for Python that aims to simplify os, os.path, os.walk, shutils, fnmatch, etcということ。サンプルを少し見てみる。*.xls か、*.xlsx を探してきて何かしたい。for filename in fs.find(['*.xls', '*.xlsx']): passconfig ディレクトリにある *.ini ファイルを local_* 以外取り出して何かしたい。for filename in fs.find('*.ini', path='config', exclude='local_*'): passVagrantfile を config ディレクトリから探して何かしたい。見つからなければ None。filename = next( fs.find('Vagrantfile', path='config'), None)backup ディレクトリにある *.sql のうち最新のアクセス時刻があるファイルを取り出して何かしたい。filename = max( fs.find('*.sql', path='backup'), key=fs.ctime).git ディレクトリを見つけて削除したい。for dir in fs.finddirs('.git'): fs.truncate(dir)なくても困らないけど、あれば、便利で、書くコードが短くて済むし、可読性もよくなるので、ちょっとツールを作るときに重宝すると思う。
2015.03.23
コメント(0)
![]()
最近のアクセス数はこんな感じ。quickgui について書いた効果なのかな。今はアクセス解析がついてないので、どこからどういうアクセスがあるのか分からないが、それなりに関心を集めたってことだと思うので、もう少し書いてみようかと思う今日この頃。全然関係ないけど、米軍から動画流出 山城議長逮捕時の基地内映像 の動画が、Youtube にあるけど、挑発しまくり。逮捕してもらいたくてたまらないという感じ。だいたい逮捕されても、仕事に支障ないように老人集めてるし。なんだかなぁ。米軍拘束事件 抗議活動への不当介入 日本共産党とか見たあと、こういう事実を目の当たりにすると、なんなんだろうと思う。事実を知った上で、こういう質問してるんだろうから。煽って、逮捕させて、国会質問って、自作自演の範疇。目的のためなら手段を選ばず。法は、自らのためのみ存在するって感じ。大阪市、政務調査費領収書公開で、共産党へのカネの流れが明らかにw なんだかなぁ。だって、党が関わっていない取引(たとえばパソコン購入)とかは別として、資料購入は赤旗、民主商工新聞、生健新聞とか党関係の発行物ばかり。印刷は当然関西共同とかどう見ても相見積もりをとっていると思えないところばっかしとか、党事務所に議員事務所をおいているところは党に家賃を払っているとか、政務調査費を党に入れようと一生懸命に見える、いろいろ楽しい支出が明らかになります。ちなみに、この記事の掲載されている 日本共産党・民青同盟悪魔の辞典+ キンピー問題笑える査問録音公開中 はおもしろい。話題はさらに変わって、これもなんだかなぁ。田母神閣下界隈の赤坂のコリアンクラブが大好きで当然な人々のお里 とか、田母神俊雄ことコリアンクラブ田母神の正体 の記事がある、匿名党 とかも見ておく。岡田克也氏、メルケル首相の慰安婦発言「日本政府に、とは言ってない」 も分けわからない。メルケル「和解」発言 独政府報道官も「正しくない」 。「Appleのエンジニア」、新しいMacBookについて(真相を?!)語る なんだかこういうのを見ている感じ。嘘字幕の古いの調べたら、総統ものでは 2009/09/16 のがあった。もっと古いものでは、キーボードクラッシャーの空耳和訳 2007/11/01 が見つかった。空耳といえば、本家。嘘も繰り返すと、そう聞こえてくる。オソロシヤ。
2015.03.15
コメント(0)
![]()
最近書いた記事をちょっと振り返ってみる。最近書いた quickgui 関連の記事quickgui 意外と便利quickgui を改造してみる (1) - シンプルな msgbox を追加quickgui を改造してみる (2) - 間延びした Inputs をコンパクトにしてみるquickgui を改造してみる (3) - やっぱりプログレスバーが欲しいquickgui を改造してみる (4) - リストを表示したいquickgui を改造してみる (5) - リスト表示から選択するquickgui を改造してみる (6) - リスト表示を改良するquickgui を改造してみる (7) - リスト表示を改良する以前書いた wxpython 関連の記事かなり前 (2010年に書いた記事) に wxPython 入門を書いたので、まとめておく。動画で学ぶ wxPython を使った GUI プログラミングwxPython を断片から学んでみるwxPython 入門 (1) フレームとアプリケーションwxPython 入門 (2) テキストコントロールwxPython 入門 (3) 文字色、背景色とフォントwxPython 入門 (4) メニューとステータスバーwxPython 入門 (5) イベントとバインドwxPython 入門 (6) (5) のソースコードwxPython 入門 (7) プログラムの終了とダイアログの表示wxPython 入門 (8) ファイルを開くダイアログwxPython 入門 (9) (8) のソースコードwxPython 入門 (10) ウィンドウ配置の概要wxPython 入門 (11) Sizer を使ったレイアウトを配置wxPython 入門 (12) Sizer を使ったレイアウトを配置 2 と パネルにラベルを付けてみる当サイトでよく読まれている記事ちなみに、当サイトで今よく読まれているページは、次のものらしい。RaspberryPi 関連の記事が上位にあるようだ。Raspberry Pi にシャットダウンボタンをつける閲覧数 1225 | 2014年12月22日Raspberry Pi に赤外線モーションセンサーをつないでみた閲覧数 905 | 2014年12月21日Raspberry Pi と Sony RC-S380/P、nfcpy で NFC カードの IDm を読み取る閲覧数 2450 | 2014年02月24日Raspberry Pi 2 買おうかなぁw【Raspberry Pi 2 ModelB】2015年2月1日発売最近機種!RaspberryPi2(ラズベリーパイ2)モデルB 英国製【Raspberry Pi 2 ModelB】2015年2月1日発売最近機種!RaspberryPi2(ラズベリーパイ2)モデルB 英国製 【売れ筋】【オススメ】
2015.03.08
コメント(0)
quickgui を改造してみる (6) - リスト表示を改良するで、quickgui に追加したコードは、次のようなもの。wxPython: Adding Checkboxes to ObjectListViewを参考にさせていただいた。from ObjectListView import ObjectListView, ColumnDefn class OLVCheckPanel(wx.Panel): """""" def __init__(self, parent, columns, data, func, func_arg): """Constructor""" wx.Panel.__init__(self, parent=parent) self.func = func self.func_arg = func_arg mainSizer = wx.BoxSizer(wx.VERTICAL) btnSizer = wx.BoxSizer(wx.HORIZONTAL) self.resultsOlv = ObjectListView(self, style=wx.LC_REPORT|wx.SUNKEN_BORDER) self.data = data self.setResults(columns, data) checkBtn = wx.Button(self, label="Check") checkBtn.Bind(wx.EVT_BUTTON, self.onCheck) btnSizer.Add(checkBtn, 0, wx.ALL, 5) uncheckBtn = wx.Button(self, label="Uncheck") uncheckBtn.Bind(wx.EVT_BUTTON, self.onUncheck) btnSizer.Add(uncheckBtn, 0, wx.ALL, 5) nextBtn = wx.Button(self, label="Next") nextBtn.Bind(wx.EVT_BUTTON, self.onNext) btnSizer.Add(nextBtn, 0, wx.ALL, 5) mainSizer.Add(self.resultsOlv, 1, wx.EXPAND|wx.ALL, 5) mainSizer.Add(btnSizer, 0, wx.CENTER|wx.ALL, 5) self.SetSizer(mainSizer) def onCheck(self, event): """""" objects = self.resultsOlv.GetObjects() for obj in objects: self.resultsOlv.SetCheckState(obj, True) self.resultsOlv.RefreshObjects(objects) def onUncheck(self, event): """""" objects = self.resultsOlv.GetObjects() for obj in objects: self.resultsOlv.SetCheckState(obj, False) self.resultsOlv.RefreshObjects(objects) def onNext(self, event): """""" obj = self.resultsOlv.GetObjects() status = [] for o in obj: s = self.resultsOlv.GetCheckState(o) status.append(s) self.func(status, self.func_arg[0], self.func_arg[1]) self.Destroy() wx.Exit() def setResults(self, columns, data): """""" self.resultsOlv.SetColumns(columns) self.resultsOlv.CreateCheckStateColumn() self.resultsOlv.SetObjects(self.data)class OLVCheckFrame(wx.Frame): def __init__(self, title, columns, data, func, size=(500,200)): """Constructor""" wx.Frame.__init__(self, parent=None, title=title, size=size) func_arg = (columns, data) make_objects = self.column_builder(columns) column_definition = self.column_def(columns) data = [make_objects(x) for x in data] self.panel = OLVCheckPanel(self, column_definition, data, func, func_arg) def column_def(self, name): columns = [] for i, n in enumerate(name): slot = "column_%d" % i column = ColumnDefn(n, "left", -3, slot) columns.append(column) return columns def column_builder(self, columns): l = len(columns) slots = [] for i in range(l): column = "column_%d" % i slots.append(column) class Results(object): __slots__ = slots def __init__(self, data): """Constructor""" for i in range(len(slots)): self.__setattr__(self.__slots__[i], data[i]) return Resultsdef CheckList(title, columns, data, func, size): app = wx.App(False) frame = OLVCheckFrame(title, columns, data, func, size=size) frame.Show() app.MainLoop() return Truechecklist = CheckList
2015.03.08
コメント(0)
![]()
quickgui を改造してみる (5) - リスト表示から選択するは、ちょっと見た目もさえないし、タイトルをクリックしたら並び替えてくれるとか、機能的にも、もう少し欲しい。ということで、wxPython: Adding Checkboxes to ObjectListView を参考にする。ObjectListView を使っているので pip install しておく。# -*- coding: utf-8 -*-import quickgui as q # 改造したものtitle = "デタラメデータ"columns = ("名前", "出生地", "生年", "血液型", "好きな食べ物")data = [("平 将門", "東京都", "1981", "A", "チョコレート"), ("平 清盛", "神奈川県", "1949", "B", "メロン"), ("宮本 武蔵", "埼玉県", "1949", "AB", "いちじく") ] def func(check_list, columns, data): print "チェックされたもの" for c in columns: print c, print count = 0 for checked in check_list: if checked: column_data = data[count] for d in column_data: print d, print count += 1q.checklist(title, columns, data, func, size=(500,200))これだけで、次のような表示になる。Nextボタンを押すと、func が実行され、上の場合、標準出力に結果を出力するようにしている。チェックされたもの名前 出生地 生年 血液型 好きな食べ物平 将門 東京都 1981 A チョコレート宮本 武蔵 埼玉県 1949 AB いちじくタイトル行をクリックすると、ソートしてくれるし、色もついて、複数行あるときに見やすくなった。ObjectListView - How I learned to stop worrying and love wx.ListCtrl をちゃんと読んで、ちゃんと使い方覚えようかな。追加したコードは、次のエントリで。
2015.03.08
コメント(0)
![]()
ここまで来たら、リストで表示されているものを選んで OK したら、選択されているものの結果を返すというのができないかとチャレンジしてみる。quickgui に次のコードを追加。import sysfrom wx.lib.mixins.listctrl import ListCtrlAutoWidthMixinclass AutoWidthListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin): def __init__(self, parent): wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT) ListCtrlAutoWidthMixin.__init__(self)class AutoList(wx.Frame): def __init__(self, parent, id, title, columns, data, size=(400, 200)): wx.Frame.__init__(self, parent, id, title, size=size) hbox = wx.BoxSizer(wx.HORIZONTAL) panel = wx.Panel(self, -1) self.list = AutoWidthListCtrl(panel) for i, name in enumerate(columns): self.list.InsertColumn(i, name) number_of_data = i for i in data: index = self.list.InsertStringItem(sys.maxint, i[0]) rest = len(i) - 1 for j in range(rest): self.list.SetStringItem(index, j+1, i[j+1]) hbox.Add(self.list, 1, wx.EXPAND) panel.SetSizer(hbox) self.Centre() self.Show(True)def autolist(title, columns, data): app = wx.App() AutoList(None, -1, title, columns, data) app.MainLoop()そして、使うときは次のようにする。# -*- coding:utf-8 -*-import quickgui as qcolumns =('名前','出生地','生年','血液型','好きな食べ物')data = [('平 将門', '東京都', '1981', 'A','チョコレート'), ('平 清盛', '神奈川県', '1949','B','メロン'), ('宮本 武蔵', '埼玉県', '1949','AB','いちじく'),]q.autolist("デタラメデータ", columns, data, size=(200,100))こんな感じになる。簡単にチェックボックス付きのリストが表示できるようになった。なんか地味だし、もうちょっとよくしたいので、なんとかしてみる。
2015.03.01
コメント(0)
全8件 (8件中 1-8件目)
1

![]()
