Tkinterで自分用のテンプレート

ちょっとしたスクリプトでも、GUIつけとくと、
あとから便利だろうということで簡単な雛形を作成しときます。

デザインは悪いけど、まぁ、使い捨て用ってことで。。。

# -*- coding: utf-8 -*-
"""
Tkinterで簡単なGUIを作る時のひな型
シンプルに。

http://www.shido.info/py/python6.htmlにあるデモを参考にしています。
"""
import Tkinter as Tk
import tkFileDialog as Fd
import ScrolledText as S
import tkMessageBox

class MyFrame(Tk.Frame):
    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)
        self.master.title('sample')

        la_top = Tk.Label(self, text=u'説明文')
        la_top.pack()

        # ファイル選択用
        f1 = Tk.Frame(self)
        la1 = Tk.Label(f1, text=u'ファイル名')
        self.entry1 = Tk.Entry(f1, width=40)
        button1 = Tk.Button(f1, text='Browse...', command=self.filedialog)
        la1.pack(side=Tk.LEFT)
        self.entry1.pack(side=Tk.LEFT)
        button1.pack(side=Tk.LEFT)
        f1.pack()

        # 設定1
        self.var_c1 = Tk.IntVar()
        self.var_c2 = Tk.IntVar()
        la_setting1 = Tk.Label(self, text=u'設定1')
        c1 = Tk.Checkbutton(self, text="check1", variable=self.var_c1)
        c2 = Tk.Checkbutton(self, text="check2", variable=self.var_c2)
        la_setting1.pack()
        c1.pack()
        c2.pack()
        # 設定2
        self.var_r1 = Tk.IntVar()
        la_setting2 = Tk.Label(self, text=u'設定2')
        r1 = Tk.Radiobutton(self, text="check1", variable=self.var_r1, value=0)
        r2 = Tk.Radiobutton(self, text="check2", variable=self.var_r1, value=1)
        la_setting2.pack()
        r1.pack()
        r2.pack()

        # テキスト
        self.txt = S.ScrolledText(self, width=40)
        self.txt.pack()

        # ボタン
        f_button = Tk.Frame(self)
        button_func = Tk.Button(f_button, text=u'なんかやる', command=self.main)
        button_help= Tk.Button(f_button, text=u'HELP', command=self.help)
        button_func.pack(side=Tk.LEFT)
        button_help.pack(side=Tk.LEFT)
        f_button.pack()

    def main(self):
        """
        メインの処理
        """
        s = "File Name: " + self.entry1.get() + "\n"
        s += "c1: %d, c2: %d\n" % (self.var_c1.get(), self.var_c2.get())
        s += "r1: %d\n" % (self.var_r1.get())
        top = Tk.Toplevel()
        t = TextFrame(top, "MAIN")
        t.set_text(s)
        t.pack()

    def help(self):
        tkMessageBox.showinfo('test', 'ヘルプだよ')

    def filedialog(self):
        # saveするときはasksavesafilename
        fname = Fd.askopenfilename(filetypes=[('All Files', ('*'))])
        if fname:
            self.entry1.delete(0, Tk.END)
            self.entry1.insert(Tk.END, fname)

class TextFrame(Tk.Frame):
    def __init__(self, master, title):
        Tk.Frame.__init__(self, master)
        self.master.title(title)

        self.txt = S.ScrolledText(self)
        self.txt.pack()

    def set_text(self, text):
        self.txt.insert(Tk.END, text)


if __name__ == '__main__':
    frame = MyFrame()
    frame.pack()
    frame.mainloop()

PythonでExcelを読み込む(xlrd)

たくさんのExcelファイルから、それぞれのあるセルにあるデータを取り出してくる必要ができました。
VBAとかでやるのが筋なのかもしれませんが、Pythonで気軽にできないか調べてみることに。


以前PyExceleratorというライブラリがあったことを思い出して調べてみると、
最近は更新が停止されていて、xlrd, xlwtというライブラリを使うのが良いみたい。


公式サイトのPython Excelにpdfでまとめられたチュートリアルがあります。
かなり詳細に書いてあるので、わかりやすいです。
これを参考にインストールからやってみます。

概要

Excelを操作するパッケージとして以下の3つが用意されています。

  • xlrd
  • xlwt
  • xlutils

xlrdが読み込み操作、xlwtが書き込み、xlutilsが既にあるExcelファイルをいじるなどのユーティリティを集めたものだそうです。
今回はxlrdのみ使います。
結構いろいろなことができるようですが、とりあえず今必要なセルの中身を読み込む操作だけやってみます。

インストール

easy_installを使って簡単にインストールできます。

easy_install xlrd

で完了です。

セルの読みだし

簡単なので、サンプルをちょっと改良するだけでできます。
わかりやすくて使いやすいですね。

import xlrd

# open_workbook関数でファイルから読み込みます。
wb = xlrd.open_workbook('test.xls')

# シートの情報を取得。
# wb.sheets()の返り値はシートの情報の入ったリスト
sheets = wb.sheets()

# シート1を使う
s = sheets[0]

# セルのオブジェクトを取得
c = s.cell(3, 2)

# セルのオブジェクトを操作して情報を取得
print c.value

こんな感じで簡単に読みだせました。

pycronの動作の謎(謎のまま)

pycronではまりまくる。


まず、プログラムの指定にはまり、ディレクトリの指定にはまり。。。
と、あれこれ調べていたら、同じようにはまった方を発見。参考になります。
http://74.125.153.132/search?q=cache:Faa0oH8O6EoJ:d.hatena.ne.jp/thalion/20091230/p1+pycron+twitter&hl=ja&ct=clnk&cd=1


それでも、呟いてくれない。。。
と思ったら同じ症状の方が。。。
pythonでtwitterのbotを作る - 六番


とりあえず、インストールしたフォルダ内にあるpycron_console.exeをずっと実行しておけば動作してくれる。
でも邪魔だなぁ。
どうすればいいんだろう。


なんとなくVistaの権限関係が問題のような気もするけど、憶測の域を出ず。

PythonでTwitterのBOTっぽいのを作る

Windows環境で、起動してる間だけ呟いてくれます。
仲間内のネタキャラとして作成したので、その際の自分用メモ。


とりあえず、python-twitterが必要。
easy_installでインストール

easy_install python-twitter

後は以下のWebを参考にスクリプトを書いた。
簡単なTwitter Botのつくりかた(python編) - peroon's diary


これを自動で実行するべく、pycronのインストール。
(Windows環境なので。。。linuxとかだったらcronか)


pycronのインストールは以下を参考にしました!
http://www.multiburst.net/ElectricBrain/2009/10/windows-cron-pycron


公式のWebからインストーラをダウンロードしてインストールします。
インストールで大事なのは、最後の"install as service"みたいな項目にチェックを入れておくこと。
これで、Windowsのサービスとして、pycronが常時インストールされるようです。
あとは、上のサイトを参考に設定するだけ!

追記 09/01/20/23:25
と思ったけど、うまくいかない。
pycronがうまく動いてないみたい。。。どうしてだろう。

適当にftplib

作業の際に、FTPで他のコンピュータから頻繁にファイルを持ってくることがあります。
いちいちftpコマンドでがちゃがちゃやるのも面倒なので、
所望のファイルを適当に拾ってくるスクリプトを組みました。
といって、書いたスクリプトは個人情報やら変なコメントやらがあったので
書きなおし。例外処理は面倒なんで無かったり。

import getpass, ftplib, sys

filename = "test.txt" # 取得するファイル名
host = ***** # host名
output_file = "out.txt" # ローカルでのファイル名

print u"passwordを入れてください"
passwd = getpass.getpass() # パスワードを求める(入力させる)
username = getpass.getuser() # ユーザー名の取得

ftp = ftplib.FTP(host)
ftp.login(username, passwd)
f = open(output_file, "w")
ftp.retrbinary("RETR %s" % filename, f.write) # ファイルの内容を転送
ftp.close()
f.close()

getpassモジュールが便利ですね。
最初知らなくて、inputとかでやりそうになってた。危ない。
ftplibは、hostを与えたFTPクラスを作って、ログインしてファイルに書きこむってかんじかな。
あんまり使い勝手が良くないような?
実際のスクリプトでは、ftpを操作する度に例外処理してたりします。