布同自製Python函數協助查詢小工具

來源:互聯網
上載者:User

比如在學習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之多,你是顯示不完的,不斷刷屏的效果估計你不會喜歡。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.