PythonのGUIにはTkinterというものがある

その備忘録を書いておく

クローラーのプログラムをGUI化した

以下が作成したアプリのソースコード

#coding: UTF-8
from Tkinter import *
import os,time,urllib,tkFileDialog,tkMessageBox
root=Tk()# windowオブジェクト
root.title(u"Spider(FC2blog.ver)")
root.resizable(False, False)
root.configure(background = '#904480')

#メニューを生成する関数の定義
def make_menu(w):
		global the_menu
		the_menu = Menu(w, tearoff=0)
		the_menu.add_command(label="切り取り")
		the_menu.add_command(label="コピー")
		the_menu.add_command(label="貼り付け")

#メニューを表示する関数の定義
def show_menu(e):
		w = e.widget
		the_menu.entryconfigure("切り取り", command=lambda: w.event_generate("<<Cut>>"))
		the_menu.entryconfigure("コピー", command=lambda: w.event_generate("<<Copy>>"))
		the_menu.entryconfigure("貼り付け", command=lambda: w.event_generate("<<Paste>>"))
		the_menu.tk.call("tk_popup", the_menu, e.x_root, e.y_root)

#メニュー生成関数の実行
make_menu(root)
root.bind_class("Entry", "<Button-3><ButtonRelease-3>", show_menu)
urltext=StringVar()
f1=LabelFrame(root, text = "探索設定",bg ='#904480', bd=2, relief=GROOVE)
a=Label(f1,text=u"サイトURL:", bg ='#904480').grid(row=0, column=0)
b=Entry(f1,textvariable=urltext,bg ='#904480',fg='black',width=40).grid(row=0, column=1,padx=10,pady=5)

pagetext=IntVar()
c=Label(f1,text=u"page取得数:", bg ='#904480').grid(row=1, column=0)
d=Spinbox(f1, from_ = 1, to = 500, increment = 1, bg ='#904480',textvariable=pagetext, width = 39).grid(row=1, column=1)
#ディレクトリ変更
path_name=""
filename=""
cu=""

#保存ディレクトリの選択用
def hozon():
		global path_name,file_name,cu
		cu=os.getcwd()
		filename = tkFileDialog.askdirectory(title="カレントディレクトリ:"+cu+"\nディレクトリを選択してください",initialdir = path_name)
	if filename != "":
    	path_name = os.path.dirname(filename)
    	os.chdir(filename)

e=Label(f1,text=u"画像保存先:",bg ='#904480').grid(row=2, column=0)
f=Button(f1,text="ディレクトリ選択",width=40, bg ='#904480',activebackground='#800080', 					cursor='heart',command=hozon).grid(row=2, column=1,padx=10,pady=5)
f2 = LabelFrame(root, text = "実行履歴", bg ='#904480', bd=2, relief = GROOVE)
# Listbox の生成
lb = Listbox(f2,width=50,height=15,bg='black',fg='white')
# Scrollbar の生成
sb1 = Scrollbar(f2, orient = 'v', command = lb.yview)
sb2 = Scrollbar(f2, orient = 'h', command = lb.xview)
# Listbox の設定
lb.configure(yscrollcommand = sb1.set)
lb.configure(xscrollcommand = sb2.set)
lb.insert(END, "*"* 15 + "実行履歴を表示する領域" + "*" * 15)
lb.insert(END, "※履歴を実行中はフリーズして見ることはできません\(~o~)/")


#スクレイピングする関数
def scrape(htmlurl):
#--------------------------<html>タグ全体の取得--------------------------------
	htmlfile = urllib.urlopen(htmlurl)
	htmltext = htmlfile.read() # html全体の取得
	lb.insert(END, u"[実行結果]")
	print u"[実行結果]"
	lb.insert(END, u"対象URL:" + htmlurl)
	print u"[対象URL:]" + htmlurl
#--------------------------<img>タグ内URLの取得--------------------------------
	lb.insert(END, u"<img>タグ内の画像取得開始")
	print u"<img>タグ内の画像取得開始"
	regex = '<img.*?src="(.*?)".*?>'
	pattern = re.compile(regex, re.I)# 大文字小文字の区別をしない
	imgageurl = re.findall(pattern, htmltext)
	save(imgageurl)
#-----------------------------<a>タグ内URLの取得-------------------------------
	lb.insert(END, u"<a>タグ内の画像取得開始")
	print u"<a>タグ内の画像取得開始"
	regex = '<a.*?href="(https?://[^"]+\.jpg)".*?>'
	pattern = re.compile(regex,re.I)
	aurl = re.findall(pattern, htmltext)
	save(aurl)
	htmlfile.close()


#画像の保存関数
def save(saveurls):
	for saveurl in saveurls:
		try:
			lb.insert(END, u"保存成功:" + os.path.basename(saveurl))
    			img = urllib.urlopen(saveurl)#URLを開く
    			localfile = open(os.path.basename(saveurl), 'wb')#URLで開く
			print os.path.basename(saveurl)
    			localfile.write(img.read())#画像の書き込み
    			img.close()
    			localfile.close()
		except:
			lb.insert(END, u"保存失敗:" + os.path.basename(saveurl))

#ダウンロード実行関数
def download():
		if urltext.get():
		for i in range(pagetext.get()):
			if i == 0:
				scrape(urltext.get())
			else:
				scrape(urltext.get() + u"page-" + str(i) + u".html")
		else:
    		tkMessageBox.showerror('エラー','URLを入力してください')


Button(root,text="画像取得開始",bg ='#904480',activebackground='#800080',cursor='spider',command=download).pack(side=BOTTOM,pady=3)
f1.pack(side=TOP,pady=3)
f2.pack(pady=3,expand = True, fill = BOTH)

# grid による配置
lb.grid(row = 0, column = 0, sticky = 'nsew',padx=1)
sb1.grid(row = 0, column = 1, sticky = 'ns',padx=0)
sb2.grid(row = 1, column = 0, sticky = 'ew',padx=1)
root.mainloop()

Pythonで作成したプログラムを単独で実行できるexe化をするために、PyInstaller-2.1というものを使用した 以下が実行に使用したコマンドである

pyinstaller.py --onefile -w --icon=Foobar.ico -y succubus.py

次に、オプションついて述べる

-w, –windowed 実行時にコマンドプロンプトを開かないようにする GUIプログラムのときに指定する

-F, –onefile プログラムを一つにまとめてくれる しかし、プログラム実行時にけっこう時間がかかる

-i <アイコンファイル>, –icon=<アイコンファイル> プログラムのアイコンを設定できる アイコンは拡張子が.icoのファイルである

-y -clean -yは既存の実行ファイルを問答無用で上書きする 修正しては何回も実行ファイルを作るときには便利である –cleanはログファイルや作業ファイルを消してから実行ファイル作成を始める

–noupx UPXを使いたくないときに指定する

以下がPythonの勉強で一番最初に読み、Tkinterに関する記述を見つけた本

以下が勉強で利用したサイト

お気楽Python/Tkinter

Python(tkinterの練習)

Pythonサンプル



Published

30 May 2015

Tags