布同自制Python函数帮助查询小工具
针对IDE内置帮助文档查阅繁琐且缺乏搜索功能的问题,提供一款基于Tkinter开发的Python本地函数查询小工具。该工具支持直接调用标准help接口检索模块说明,可将结果导出为配置文件并支持本地管理与二次编辑,无需联网即可快速完成API查阅。
背景与使用场景
在学习list、tuple、dict、str以及系统模组时,利用Python自带的文档接口能够快速获取全面的功能说明。但在IDLE或其他编辑器中进行段式编程时,内置的帮助窗口往往无法有效搜索大型库(如wx)的API,且翻页查看效率较低。为解决这一痛点,可通过运行本工具实现离线的快速检索与本地化保存,降低查阅门槛。
准备条件与运行环境
本工具基于Python与Tkinter构建,运行前需确保基础依赖已就位:
- Tkinter:系统默认集成,无需额外安装。
- Pmw与wx:本脚本的界面与控件依赖库。若报错需手动添加至Python环境。
初次使用前,请在源码同级目录手动创建以下两个文件,否则程序将因找不到对象而中断:
readme.txt:用于存放工具的基础使用说明。data.ini:用于持久化存储已保存的查询条目与分类。
工具操作流程
第1步:启动查询界面
在命令行中直接执行源码文件(双击.py或运行python yourscript.py)。程序将自动加载左侧条目列表、中间文本编辑区与底部输入框。主窗口标题显示为“Python函数查询器”,此时系统已进入待命状态。
第2步:检索模块与函数说明
在底部输入框中输入目标名称(例如list、tuple或自定义封装的类名),按下Enter键或点击“查找”按钮。工具会捕获标准输出流,调用Python原生help()机制并将结果实时渲染至右侧文本框。若输入名称未在当前模块上下文中定义,工具会尝试通过__import__()动态导入对应包后再次获取说明。
第3步:编辑、保存与管理条目
查询结果生成后,可直接在文本框内添加中文注释或调整排版。完成修改后,点击“新建保存”按钮,当前条目将被写入data.ini并归档至左侧下拉列表。若需复用历史记录,点击左侧列表项即可一键还原对应文档。右键单击列表可触发快捷菜单,支持“删除”与“重命名”操作,方便按个人习惯整理知识库。修改完成后务必点击“保存修改”,否则变更不会同步至配置文件。
#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
sys.stdout = 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
self.helpbtn.config(state=NORMAL)
def save(self):
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
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.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
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()
依赖库安装指引
若启动时报错缺少模块,请按以下路径补充环境:
- 安装Pmw:下载
Pmw.1.3.2.tar.gz解压后,将根目录下的Pmw文件夹复制至Python安装主目录(如C:\Python27\),保持原有结构即可。 - 安装wxPython:前往官网或可信镜像站下载对应版本的
wxPython*.exe安装包。双击运行默认安装向导,程序会自动将底层C++绑定层部署至Lib\site-packages\wx-*目录下。
验证安装是否成功:打开Python命令行,依次输入import Pmw与import wx。若无 traceback 报错即表示环境正常。不建议在此时使用help()查验wx详情,因其元数据庞大极易导致终端刷屏卡顿。
简要总结
本工具核心在于将Python原生的文档查询能力包装为具备本地缓存与人工批注功能的GUI应用。通过合理的文件读写逻辑与事件绑定,实现了“检索→编辑→存档→复用”的闭环工作流。对于不熟悉外部搜索引擎或受网络限制的开发场景,此类自研轻量脚本能有效提升翻阅标准库的效率,同时其清晰的布局设计与模块化拆解也为初学者提供了良好的工程实践参考。 以上就是Python函数帮助查询小工具的详细内容,更多关于Python本地辅助开发工具的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









