比如在學習list、tuple、dict、str、os、sys等模組的時候,利用Python的內建文檔可以很快速的全面的學到那些處理的函數。所以這個內建文檔功能能夠給出學者帶來很大的方便之處,進行簡短的開發是再好不過的。
但是,當你離開CMD,要利用IDLE或者要用Komodo Edit等軟體進行“段式編程”的時候,就有些捉襟見肘了。例如,wx庫非常之大,協助檔案有10MB之多,如果你在CMD中開啟,你可以想想你需要多少時間才能夠查看到你想要的協助資訊。大規模的熟悉Python的各種API之後,你會發現,這個並不是想象的那麼好用。不斷的按任意鍵進行翻頁,同時頁面內能夠容納的頁面也有限。所以表現出非常大的不便之處。
這裡大概有兩種方法解決。
第一,使用Module Docs工具
這個工具是Python GUI IDLE內建的一個查詢協助檔案的方法。在裡面可以利用網頁的形式,利用原生本地功能,提供一個類比線上的一個查詢方法。它可以開啟一個網頁,上面可以顯示出所有的函數,並帶有規範的分類,比較清楚,但是使用起來還是不方便,畢竟沒有搜尋功能。如果將查到的網頁內容儲存連結,那麼是不可以持續使用的。所以這個就有很大的問題,同時,其產生的網頁檔案巨大,記憶體太小是會給系統帶來壓力。所以這個方法並不是一個可以很方便使用的方法。
第二,自己開發工具
其實我也不願意自己開發工具,因為這個畢竟需要時間,幾天時間或者幾個周的時間說少也少,說多也多,而且給自己的內心產生的壓力也不小,畢竟需要分心不少來做這個事情。我在網上找了很長時間,都沒有找到,對於wx,我找到一個wxPython API的英文文檔,上面介紹的很不清楚,非常模糊,直接列出了函數和具體的參數,如何使用基本很少提及,而且很多控制項的各種style也沒有詳細列舉出來。所以是很不好用的,如果是名字忘掉了,那還可以查一下完整的單詞和詳細的參數列表。其他的功能就完全很少涉及到了。
鑒於此,我決定自己做一個小工具,花費較小的系統代價來方便的查詢各種函數和模組的功能。這裡只給出一個能使用的版本。開放原始碼給大家,代碼風格和控制項設計可供初學者模仿。高手願意來批評我,我洗耳恭聽。後續版本也會發布在這裡,到時候可能就先封裝之後在發布,現在發布的這個是原始碼檔案,大家都知道,Python的原始碼檔案雙擊即可執行。
複製代碼 代碼如下:#coding=utf-8
#功能介紹:本軟體最初只用於模組和函數用法的查詢,進行快速的顯示
#擴充功能:可以將查詢成功的結果儲存到本地,
# 將裡面的部分函數使用漢語進行注釋之後的結果儲存下來
# 以儲存的關鍵字放於右側列表
#深度擴充:使用資料庫儲存結果,並提供增刪查改的介面
from Tkinter import *
from StringIO import StringIO
from tkSimpleDialog import *
import sys
import Pmw
import ConfigParser
import os
import wx
class Finder(Frame):
def OnFind(self):
#執行,並擷取結果
info = self.inputStr.get()
if len(info)==0:
return True
buff =StringIO()
temp = sys.stdout #儲存標準I/O流
sys.stdout = buff #將標準I/O流重新導向到buff對象
self.text.delete(1.0, END)
try:
fmt = 'help('+info+')'
result = eval(fmt)
self.text.insert(1.0, buff.getvalue())
self.savebtn.config(state=NORMAL)
except:
try:
__import__(info)
fmt = 'help('+self.inputStr.get()+')'
result = eval(fmt)
self.text.insert(1.0, buff.getvalue())
except:
self.text.insert(1.0,"ERROR.")
sys.stdout =temp #恢複標準I/O流buff.getvaue()
self.helpbtn.config(state=NORMAL)
def save(self):
#搜尋,如果沒有找到就儲存,使用ini檔案進行,儲存資料
#儲存原始
tofind = self.inputStr.get()
if len(tofind)==0:
return
filename='s_'+tofind+'.ini'
fout = open(filename,'w')
fout.write(self.text.get(1.0, END).encode('utf-8'))
fout.close()
self.items.append(tofind)
self.items.sort()
self.config.add_section(tofind)
self.config.write(open('data.ini', 'r+'))
nindex = self.items.index(tofind)
self.box.delete(0,END)
self.box.insert(0, *self.items)
self.box.see(nindex)
self.box.selection_set(nindex)
self.savebtn.config(state=DISABLED)
def saveas(self):
#儲存修改
index = self.box.curselection()
if index<0:
return
tofind = self.box.get(index)
if len(tofind)==0:
return
strinfo = self.text.get(1.0, END)
filename='s_'+tofind+'.ini'
fout = open(filename,'w')
fout.write(strinfo.encode("UTF-8"))
fout.close()
self.saveasbtn.config(state=DISABLED)
def __init__(self):
Frame.__init__(self)
self.option_add('*Font', 'Verdana 12 bold')
self.pack(expand=YES, fill=BOTH)
self.master.title(u'Python函數查詢器')
self.master.iconname("calc1")
#左側列表,放置已儲存的條目,按照字母順序排序
infoF = Frame(self)
infoF.pack(side=LEFT,expand=NO, fill=BOTH)
listF = Frame(infoF)
listF.pack(side=TOP,expand=YES, fill=BOTH)
#擷取項目
self.config = ConfigParser.ConfigParser()
self.config.read('data.ini')
self.items = self.config.sections()
self.items.sort()
self.box = Listbox(listF,width=15,selectmode=SINGLE)
self.box.insert(0, *self.items)
self.box.bind('<ButtonRelease-1>',self.selectionCommand)#使用滑鼠釋放訊息
self.box.bind('<ButtonRelease-3>',self.boxrightmenu)#使用右鍵菜單刪除項目
self.PopupMenu=Menu(listF)
self.PopupMenu.add_command(label=u'刪除',command=self.deleteitem)
self.PopupMenu.add_command(label=u'重新命名',command=self.renameitem)
self.box.pack(side=LEFT,expand=YES,fill=BOTH)
self.slbar = Scrollbar(listF, orient=VERTICAL, command=self.box.yview)
self.slbar.pack(side=RIGHT, expand=NO, fill=BOTH)
self.box.configure(yscrollcommand=self.slbar.set)
btnf = Frame(infoF)
btnf.pack(side=BOTTOM, fill=BOTH)
self.savebtn = Button(btnf, text=u'建立儲存',state=DISABLED, command=self.save)
self.savebtn.pack(side=LEFT, expand=YES, fill=BOTH)
self.saveasbtn = Button(btnf, text=u'儲存修改',state=DISABLED, command=self.saveas)
self.saveasbtn.pack(side=RIGHT, expand=YES, fill=BOTH)
#包括列表資訊和顯示資訊
twoF = Frame(self)
twoF.pack(side=BOTTOM, expand=YES, fill=BOTH)
#顯示資訊、捲軸
showF = Frame(twoF, relief=SUNKEN)
self.text = Text(showF,height=25, width =65)
self.text.insert(1.0,'information...')
self.text.pack(side=LEFT, expand=YES, fill=BOTH)
self.text.bind("<Key>", self.modify)
self.text.bind("<Double-Button-1>", self.tomodify)
self.ismodified = False
showF.pack(side=TOP,expand=YES, fill=BOTH)
self.scrollbar = Scrollbar(showF, orient=VERTICAL, command=self.text.yview)
self.scrollbar.pack(side=RIGHT, expand=NO, fill=BOTH)
self.text.configure(yscrollcommand=self.scrollbar.set)
#提供輸入介面,和功能如:尋找
inputF = Frame(twoF)
inputF.pack(side=BOTTOM, fill=BOTH)
self.inputStr = StringVar()
self.inputStr.set('')
self.info = StringVar()
self.info.set('infomation...')
self.entry = Entry(inputF, relief=SUNKEN, textvariable=self.inputStr)
self.entry.bind("<Return>", self.inputreturn)
self.entry.pack(side=LEFT, expand=YES, fill=BOTH)
self.findbtn = Button(inputF,text=u'尋找',command=self.OnFind)
self.findbtn.pack(side=LEFT, expand=YES, fill=BOTH)
self.helpbtn = Button(inputF,text=u'協助',command=self.OnHelp)
self.helpbtn.pack(expand=NO, fill=Y)
def OnHelp(self):
fp = open('readme.txt')
buff = fp.read()
fp.close()
self.text.delete(1.0, END)
self.text.insert(1.0, buff)
self.helpbtn.config(state=DISABLED)
def deleteitem(self):
#右鍵菜單, 刪除功能
sels = self.box.curselection()
if len(sels) == 0:
pass #print 'no selection'
else:
sec = self.items[int(sels[0])]
self.config.remove_section(sec)
self.config.write(open('data.ini', 'w'))
self.box.delete(sels[0])
# self.items.remove(sels[0]) #是引用效果
self.text.delete(1.0, END)
self.text.insert(1.0,'delete success.')
def renameitem(self,event=None,en=None):
#郵件菜單, 重新命名功能
retval = askstring("input",
"input the new name:")
if len(retval)==0:
return
sels = self.box.curselection()
if len(sels) == 0:
pass #print 'no selection'
else:
#數組/表/設定檔
sec = self.items[int(sels[0])]
self.box.delete(0, END)
self.items[int(sels[0])] = retval #數組
self.items.sort()
self.box.insert(0, *self.items) #表
self.config.remove_section(sec)
self.config.add_section(retval)
self.config.write(open('data.ini', 'w')) #設定檔
self.text.delete(1.0, END)
self.text.insert(1.0,'rename success.')
def boxrightmenu(self,event=None,en=None):
#彈出右鍵菜單
self.PopupMenu.tk_popup(*self.winfo_pointerxy())
def tomodify(self,event=None,en=None):
if self.ismodified==True:
self.saveasbtn.config(state=DISABLED)
self.ismodified = False
else:
self.saveasbtn.config(state=NORMAL)
self.ismodified = True
return True
def modify(self,event=None,en=None):
self.saveasbtn.config(state=NORMAL)
return True
def inputreturn(self,event=None,en=None):
self.OnFind()
return True
def selectionCommand(self,event=None,en=None):
# 選中列表時, 顯示詳細內容
sels = self.box.curselection()
if len(sels) == 0:
pass
else:
filename='s_'+self.box.get(sels[0])+'.ini'
fp = open(filename)
strinfo = fp.read()
fp.close()
self.text.delete(1.0, END)
self.text.insert(1.0,strinfo)
self.helpbtn.config(state=NORMAL)
if __name__ == '__main__':
Finder().mainloop()
注意事項,原始碼檔案如果想要正確執行,請自己建立一個readme.txt檔案,和data.ini檔案。否則將會因為這兩個檔案打不開而出錯。為什麼沒有使用異常處理呢?我沒有沒有完善到那一步。現在這個版本已經可以使用了,所以大家不防試試看。
想要完整的所有檔案,請點擊:附件下載 進行下載。
【注意】:開啟軟體後,請輸入list、tuple、dict等類型進行查詢,點擊建立儲存即可儲存到列表,供下次快速開啟。
有的包在原始碼中沒有包括,如codecs。這個時候你需要手動的將這個包添加到源檔案的開頭,才能夠查詢到,如:import codecs。
如果你修改了顯示框中的文本,請及時點擊儲存修改進行儲存,以便下次開啟還可以看到你修改的效果。
本版本並不完善,而且功能有限,本身基於Python做的,所以其價值還是作為Python開發應用執行個體為主。
有修改意見請留言。
2011-03-10 12:15:05
有網友反映不能夠正確執行這個原始碼。我思考之後認為,跟版本應該沒有關係,這些都是很基本的函數和用法。你如果不能夠執行,請你嘗試正確安裝Pmw和wx這兩個包。
1、Pmw的安裝方式為:
下載:Pmw.1.3.2.tar.gz。這個東西很好找,請百度一下即可。下載之後就地解壓,找到其中的“Pmw”目錄,將這個目錄複寫到你Pyhton的安裝目錄下即可,不需要其他具體的目錄。直接是C:\Python27\下就可以,其他的Python版本請相應的做出調整。
2、wx的安裝方式為:
下載:wxPython2.8-win32-unicode-2.8.11.0-py27.exe。這個東西請百度一下,估計到wxPython的官方的英文網站下載最好,很多中文網站也提供了下載,所以找到不是難事。雙擊進行預設的安裝即可,你不用改變目錄或者其他。它會自動的安裝到你的安裝目錄下,我的目錄是:C:\Python27\Lib\site-packages\wx-2.8-msw-unicode。
3、Tkinter庫已經系統整合,不需要安裝。主要是上面兩個庫即可。
4、如何檢驗是否安裝正確?
安裝之後,請到Python的COMMAND LINE中輸入:import wx或者import Pmw嘗試是否輸入正確。沒有提示資訊就是正確的。你還可以進一步看看包中的資訊,輸入如:dir(wx)或者dir(Pmw)。不推薦使用help()函數,正如我上面所說,wx的資訊多達10MB之多,你是顯示不完的,不斷刷屏的效果估計你不會喜歡。