布同自制Python函数帮助查询小工具

何川
何川
发布时间:2026-10-12| 1人浏览过
原创

针对IDE内置帮助文档查阅繁琐且缺乏搜索功能的问题,提供一款基于Tkinter开发的Python本地函数查询小工具。该工具支持直接调用标准help接口检索模块说明,可将结果导出为配置文件并支持本地管理与二次编辑,无需联网即可快速完成API查阅。

背景与使用场景

在学习list、tuple、dict、str以及系统模组时,利用Python自带的文档接口能够快速获取全面的功能说明。但在IDLE或其他编辑器中进行段式编程时,内置的帮助窗口往往无法有效搜索大型库(如wx)的API,且翻页查看效率较低。为解决这一痛点,可通过运行本工具实现离线的快速检索与本地化保存,降低查阅门槛。

准备条件与运行环境

本工具基于Python与Tkinter构建,运行前需确保基础依赖已就位:

  • Tkinter:系统默认集成,无需额外安装。
  • Pmw与wx:本脚本的界面与控件依赖库。若报错需手动添加至Python环境。

初次使用前,请在源码同级目录手动创建以下两个文件,否则程序将因找不到对象而中断:

  1. readme.txt:用于存放工具的基础使用说明。
  2. 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本地辅助开发工具的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。