1. 程式人生 > >python 幫助文件檢視

python 幫助文件檢視

 這個程式碼是基於python3.0寫的,有許多不完善的地方,請自已修改。

# coding: utf-8

from tkinter import *

root = Tk()
root.title("python3.0查詢")
#root.minsize(800,600)
#填充無用空間
Label(root).grid(ipady=5)

#11面板
class Frame11:
    def __init__(self, root):   #relief: SUNKEY,RIDGE,GROOVE,RAISED,FLAT,SOLID  
        frame = Frame(root, width=200, height=50, borderwidth=2, relief=GROOVE)
        frame.grid(row=2, column=1, sticky=W + S)
       
        self.keyLb = Label(frame, text="鍵入關鍵字:", font="Helvetica -12 bold")
        self.keyLb.grid(row=5, column=0, sticky=W + S)
        self.inputEn = Entry(frame, width=35)
        self.inputEn.__name__ = "inputEn"
        self.inputEn.grid(row=6, column=0)
        self.inputEn.bind("<Return>", self.frashAll)
   
   
    #根據使用者的輸入回車重新整理所有相關聯的顯示元件:   
    def frashAll(self, event):
        frame21.keyLs.delete(0, END)
        frame21.frash()
       
        frame22.frash()
       
    #重新整理自已的顯示元件,由其它元件根據需要呼叫
    def frash(self):
        pass
       
  
#21面板    
class Frame21:
    def __init__(self, root):
        frame = Frame(root, width=200, height=300, borderwidth=2, relief=GROOVE)
        frame.grid(row=10, column=1, pady=5, sticky=W)
       
        #儲存記錄資訊
        self.info = []
       
        #變數在列表中的開頭和結尾位置的索引
        self.varStart = -1
        self.varEnd = -1
       
        #函式在列表中的開頭和結尾位置的索引
        self.fucStart = -1
        self.fucEnd = -1
       
        #類在列表中的開頭和結尾位置的索引
        self.classStart = -1
        self.classEnd = -1
       
        #模組在列表中的開頭和結尾位置的索引
        self.modStart = -1
        self.modEnd = -1
       
        self.keyVScl = Scrollbar(frame)
        self.keyVScl.pack(side=RIGHT, fill=Y)
        self.keyHScl = Scrollbar(frame, orient=HORIZONTAL)
        self.keyHScl.pack(side=BOTTOM, fill=X)
       
        self.keyLs = Listbox(frame, xscrollcommand=self.keyHScl.set, yscrollcommand=self.keyVScl.set)
        self.keyLs.bind("<Double-Button-1>", self.click)
   
        self.keyLs.pack(side=LEFT, fill=BOTH, ipadx=36, ipady=100)
        self.keyVScl.config(command=self.keyLs.yview)
        self.keyHScl.config(command=self.keyLs.xview)
       
    #恢復原始變數值
    def reset(self):
        self.varStart = -1
        self.varEnd = -1
        self.fucStart = -1
        self.fucEnd = -1
        self.classStart = -1
        self.classEnd = -1
        self.modStart = -1
        self.modEnd = -1
        
    #滑鼠按下監聽,根據列表框中的雙擊事件,相應的更新Frame22中的顯示內容
    def click(self, event):
        frame22.frash()   
        
    #重新整理自已的顯示元件,由其它元件根據需要呼叫   
    def frash(self):
       
        #恢復原始變數值
        self.reset()
        self.keyLs.delete(0, END)
       
        #儲存記錄
        self.info.insert(0, frame11.inputEn.get())

        varInfo = []
        fucInfo = []
        classInfo = []
        modInfo = []
        otherInfo = []
      
        try:
            print("input:",self.info[0])
            pos = self.info[0].find(".")
           
#            if pos != -1:
#                exec("import " + self.info[0][:pos])
#            else:
#                exec("import " + self.info[0])
               
            exec("import " + self.info[0])
            exec("self.swap=dir(" + self.info[0] + ")")
           
            for var in self.swap:
                exec("self.t=type(" + self.info[0] + "." + var + ")")
                s = str(self.t)
               
                if s.find("module") != -1:
                    modInfo.append(var)
                   
                elif s.find("type") != -1:
                    classInfo.append(var)
                   
                elif s.find("function") != -1:
                    fucInfo.append(var)
               
                else:
                    varInfo.append(var)
               
        except:
            print("input erro")
       
       
        if len(varInfo) > 0:
            self.varStart = 0
            self.varEnd = len(varInfo) + 1
       
        if len(fucInfo) > 0:
            self.fucStart = self.varEnd + 1
            self.fucEnd = self.fucStart + len(fucInfo) + 1
       
        if len(classInfo) > 0:
            self.classStart = self.fucEnd + 1
            self.classEnd = self.classStart + len(classInfo) + 1
           
        if len(modInfo) > 0:
            self.modStart = self.classEnd + 1
            self.modEnd = self.modStart + len(modInfo) + 1  

       
        #顯示變數
        if frame12.var1.get() == 1:
            self.showVar(varInfo)
           
        #顯示函式
        if frame12.var2.get() == 1:
            self.showFuc(fucInfo)
           
        #顯示類
        if frame12.var3.get() == 1:
            self.showClass(classInfo)
       
        #顯示模組
        if frame12.var4.get() == 1:
            self.showMod(modInfo)
           
        #顯示全部
        if frame12.var5.get() == 1:
            self.showAll(varInfo, fucInfo, classInfo, modInfo)
           
       
          
    #顯示變數
    def showVar(self, varInfo):
        if len(varInfo) == 0:
            return
       
        self.keyLs.insert(END, "        變數:")
        for var in varInfo:
            self.keyLs.insert(END, str(var))
        self.keyLs.insert(END, "")  
   
    #顯示函式
    def showFuc(self, fucInfo):
        if len(fucInfo) == 0:
            return
       
        self.keyLs.insert(END, "        函式:")
        for var in fucInfo:
            self.keyLs.insert(END, str(var))
        self.keyLs.insert(END, "")
   
    #顯示類
    def showClass(self, classInfo):
        if len(classInfo) == 0:
            return
       
        self.keyLs.insert(END, "        類:")
        for var in classInfo:
            self.keyLs.insert(END, str(var))
        self.keyLs.insert(END, "")
          
    #顯示模組
    def showMod(self, modInfo):
        if len(modInfo) == 0:
            return
       
        self.keyLs.insert(END, "        模組;")
        for var in modInfo:
            self.keyLs.insert(END, str(var))
        self.keyLs.insert(END, "")
       
    #顯示全部
    def showAll(self, varInfo, fucInfo, classInfo, modInfo):
        self.showVar(varInfo)
        self.showFuc(fucInfo)
        self.showClass(classInfo)
        self.showMod(modInfo)
       
    #顯示其它
    def showOther(self):
        print("showAll")

#12面板
class Frame12:
    def __init__(self, root):
        frame = Frame(root, width=500, height=42, borderwidth=2, relief=GROOVE)
        frame.grid(row=2, column=2, padx=12, sticky=W + S)
       
        self.modLb = Label(frame, text="模組查詢方式:", font="Helvetica -12 bold")
        self.modLb.grid(row=0, column=0)
       
        #變數
        self.var1 = IntVar()
        self.varCb = Checkbutton(frame, text="變數", variable=self.var1)
        self.varCb.__name__ = "varCb"
        self.varCb.bind("<Button-1>", self.frash)
        self.varCb.grid(row=0, column=1)
       
        #函式
        self.var2 = IntVar()
        self.fucCb = Checkbutton(frame, text="函式", variable=self.var2)
        self.fucCb.__name__ = "fucCb"
        self.fucCb.bind("<Button-1>", self.frash)
        self.fucCb.grid(row=0, column=2)
       
        #類
        self.var3 = IntVar()
        self.classCb = Checkbutton(frame, text="類", variable=self.var3)
        self.classCb.__name__ = "classCb"
        self.classCb.bind("<Button-1>", self.frash)
        self.classCb.grid(row=0, column=3)
       
        #模組
        self.var4 = IntVar()
        self.modCb = Checkbutton(frame, text="模組", variable=self.var4)
        self.modCb.__name__ = "modCb"
        self.modCb.bind("<Button-1>", self.frash)
        self.modCb.grid(row=0, column=4)
       
        #全部(預設)
        self.var5 = IntVar()
        self.var5.set(1)
        self.allCb = Checkbutton(frame, text="全部(預設)", variable=self.var5)
        self.allCb.bind("<Button -1>", self.frash)
        self.allCb.__name__ = "allCb"
        self.allCb.grid(row=0, column=5)
       
        self.cmdLb = Label(frame, text="命令查詢方式:", font="Helvetica -12 bold")
        self.cmdLb.grid(row=1,column=0)
       
        self.var21 = IntVar()
        self.docCb = Checkbutton(frame, text="doc", variable=self.var21)
        self.docCb.bind("<Button-1>", self.frash)
        self.docCb.__name__ = "docCb"
        self.docCb.grid(row=1, column=1)
       
        self.var22 = IntVar()
        self.dirCb = Checkbutton(frame, text="dir", variable=self.var22)
        self.dirCb.bind("<Button-1>", self.frash)
        self.dirCb.__name__ = "dirCb"
        self.dirCb.grid(row=1, column=2)
       
        self.var23 = IntVar()
        self.helpCb = Checkbutton(frame, text="help", variable=self.var23)
        self.helpCb.bind("<Button-1>", self.frash)
        self.helpCb.__name__="helpCb"
        self.helpCb.grid(row=1, column=3)
       
    #模組查詢選項是否被選擇:
    def modCheck(self):
        if self.var1.get()==1 or self.var2.get()==1 or self.var3.get()==1 or self.var4.get()==1 or self.var5.get()==1:
            return True
        else:
            return False   
       
    #模組查詢方式選項清空:
    def modReset(self):
        self.var1.set(0)
        self.var2.set(0)
        self.var3.set(0)
        self.var4.set(0)
        self.var5.set(0)
       
    #命令查詢選項是否被選擇:
    def cmdCheck(self):
        if self.var21.get()==1 or self.var22.get()==1 or self.var23.get()==1:
            return True
        else:
            return False
       
    #命令查詢方式選項清空:
    def cmdReset(self):
        self.var21.set(0)
        self.var22.set(0)
        self.var23.set(0)
       
    def frash(self, event):
       
        #變數選項與全部選項互斥
        if event.widget.__name__ == "varCb" and self.var1.get() == 0:
            self.cmdReset()
            self.var5.set(0)
            self.var1.set(1)
            frame21.frash()
            self.var1.set(0)
           
        elif event.widget.__name__=="varCb" and self.var1.get()==1:
            self.var1.set(0)
            frame21.frash()
            self.var1.set(1)
        
        #函式選項與全部選項互斥  
        elif event.widget.__name__ == "fucCb" and self.var2.get() == 0:
            self.cmdReset()
            self.var5.set(0)
            self.var2.set(1)
            frame21.frash()
            self.var2.set(0)
           
        elif event.widget.__name__=="fucCb" and self.var2.get()==1:
            self.var2.set(0)
            frame21.frash()
            self.var2.set(1)
           
        #類選項與全部選項互斥
        elif event.widget.__name__ == "classCb" and self.var3.get() == 0:
            self.cmdReset()
            self.var5.set(0)
            self.var3.set(1)
            frame21.frash()
            self.var3.set(0)
           
        elif event.widget.__name__=="classCb" and self.var3.get()==1:
            self.var3.set(0)
            frame21.frash()
            self.var3.set(1)
       
           
        #模組選項與全部選項互斥
        elif event.widget.__name__ == "modCb" and self.var4.get() == 0:
            self.cmdReset()
            self.var5.set(0)
            self.var4.set(1)
            frame21.frash()
            self.var4.set(0)
           
        elif event.widget.__name__=="modCb" and self.var4.get()==1:
            self.var4.set(0)
            frame21.frash()
            self.var4.set(1)
           
       
        #全部選項與其它選項互斥
        elif event.widget.__name__ == "allCb" and self.var5.get() == 0:
            self.cmdReset()
            self.var1.set(0)
            self.var2.set(0)
            self.var3.set(0)
            self.var4.set(0)
            self.var5.set(1)
            frame21.frash()
            self.var5.set(0)
           
        elif event.widget.__name__=="allCb" and self.var5.get() == 1:
            self.var5.set(0)
            frame21.frash()
            self.var5.set(1)
           
        elif event.widget.__name__=="docCb" and self.var21.get() == 0:
            self.modReset()
            self.var21.set(1)
            frame22.frash()
            self.var21.set(0)
           
        elif event.widget.__name__=="docCb" and self.var21.get() == 1:
            self.var21.set(0)
            frame22.frash()
            self.var21.set(1)
           
        elif event.widget.__name__=="dirCb" and self.var22.get() == 0:
            self.modReset()
            self.var22.set(1)
            frame22.frash()
            self.var22.set(0)
           
        elif event.widget.__name__=="dirCb" and self.var22.get() == 1:
            self.var22.set(0)
            frame22.frash()
            self.var22.set(1)
       
        elif event.widget.__name__=="helpCb" and self.var23.get() == 0:
            self.modReset()
            self.var23.set(1)
            frame22.frash()
            self.var23.set(0)
           
        elif event.widget.__name__=="helpCb" and self.var23.get() == 1:
            self.var23.set(0)
            frame22.frash()
            self.var23.set(1)
    
 
#22面板
class Frame22:
    def __init__(self, root):
        frame = Frame(root, width=400, height=200, borderwidth=2, relief=GROOVE)
        frame.grid(row=10, column=2, padx=12, pady=10, sticky=S + N) 
       
        self.keyVScl = Scrollbar(frame)
        self.keyVScl.pack(side=RIGHT, fill=Y)
        self.keyHScl = Scrollbar(frame, orient=HORIZONTAL)
        self.keyHScl.pack(side=BOTTOM, fill=X)
       
        self.keyTx = Text(frame, xscrollcommand=self.keyHScl.set, yscrollcommand=self.keyVScl.set, wrap='n')
        self.keyTx.tag_config("r", foreground="red")
        self.keyTx.tag_config("b", foreground="#0055ff")
        self.keyTx.tag_config("g", foreground="green")
        self.keyTx.tag_config("bb", background="#f010f0")
        self.keyTx.pack(side=LEFT, fill=BOTH)
        self.keyVScl.config(command=self.keyTx.yview)
        self.keyHScl.config(command=self.keyTx.xview)
       
       
    #顯示模組查詢的結果:
    def frash(self):   
        if frame12.modCheck()==True:
            self.showMod()
       
        elif frame12.cmdCheck()==True:
            self.showCmd() 
           
           
    #顯示命令查詢的結果:
    def showCmd(self):
       
        if frame11.inputEn.get().isalpha()==False:
            frame21.keyLs.delete(0, END)
            frame21.frash()
           
        print("isalpha:",frame11.inputEn.get()[0].isalpha())
       
        if len(frame11.inputEn.get()) and frame11.inputEn.get()[0].isalpha() > 0:
            str=frame11.inputEn.get()
            l = str.split(".")
            s = len(l)
            print("al: ",l[s-1][0])
           
            #如果出現異常,說明最後一個分隔的字串一定不是模組
            try:
                exec("import " + frame11.inputEn.get())
            except:
                #去掉最後一個分隔重新匯入
                newl=l[0:s-1]
                newstr=""
                for var in newl:
                    newstr=newstr+var
                exec("import "+newstr)
                print("newline: ",newstr)
           
        elif len(frame11.inputEn.get())<=0:
            return
           
       
        index = -1
        if len(frame21.keyLs.curselection()) != 0:
            index = int(frame21.keyLs.curselection()[0])
       
        #清空Text元件的內容
        self.keyTx.delete(1.0, END)
        import os
        path = "cmd.txt"
        temp = sys.stdout
        sys.stdout = open(path, "w")
       
        if frame12.var21.get()==1:
            print("doc命令查詢:")
            try:
                if index == -1:
                    exec("self.str=" + frame11.inputEn.get() + ".__doc__")
                    print(self.str)
                else:
                    exec("self.str=" + frame11.inputEn.get() + "." + frame21.keyLs.get(index) + ".__doc__")
                    print(self.str)
            except:
                print("doc命令沒有查詢到資訊")
               
        print()
        if frame12.var22.get()==1:
            print("dir命令查詢:")
            try:
                if index == -1:
                    exec("self._dir=dir("+frame11.inputEn.get()+")")
                    print(self._dir)
                else:
                    exec("self._dir=dir("+frame11.inputEn.get()+"."+frame21.keyLs.get(index)+")")
                    print(self._dir)
            except:
                print("dir命令沒有查詢到資訊")
             
        print() 
        if frame12.var23.get()==1:
            print("help命令查詢: ")
            if index == -1:
                exec("self.str=help(" + frame11.inputEn.get() +")")
            else:
                exec("self.str=help(" + frame11.inputEn.get() + "." + frame21.keyLs.get(index) + ")")
        sys.stdout.flush()
        sys.stdout=temp
       
        print()
        file = open(path,"r")
        num = 1.0
        while True:
            line = file.readline()
           
            if len(line) == 0:
                break
            else: 
                if (line.startswith("doc") or line.startswith("dir") or line.startswith("help"))and (line.find(":")!=-1 or line.find(":")!=-1):
                    self.keyTx.insert(num, line, "b")
                    num = num + 1
                else:
                    self.keyTx.insert(num, line)
                    num = num + 1
        file.close()  
       
    
    #顯示模組查詢的結果:  
    def showMod(self):
       
        #清空Text元件內容
        self.keyTx.delete(1.0, END)
       
        #沒有在Frame21中選擇
        if len(frame21.keyLs.curselection()) <= 0:
            import os
            path = "module.txt"
           
            import sys
            temp = sys.stdout
            sys.stdout = open(path, "w")
            print(help(frame11.inputEn.get()))
#            sys.stdout.close() #?????
            sys.stdout.flush()
            sys.stdout = temp
           
            file = open(path, "r")
           
            num = 1.0
            while True:
                line = file.readline()
                if len(line) == 0:
                    break
                else: 
                    self.keyTx.insert(num, line)
                    num = num + 1
            file.close()  
       
       
        #在Frame21中選擇
        if len(frame21.keyLs.curselection()) > 0:
            index = int(frame21.keyLs.curselection()[0])
           
            #選擇的是變數
            if index > frame21.varStart and index < frame21.varEnd:
                num = 1.0
                import os
                exec("import " + frame11.inputEn.get())
                exec("self.t=type(" + frame11.inputEn.get() + "." + frame21.keyLs.get(index) + ")")
                exec("self.value=" + frame11.inputEn.get() + "." + frame21.keyLs.get(index))
                exec("self.str=" + frame11.inputEn.get() + "." + frame21.keyLs.get(index) + ".__doc__")
                self.keyTx.insert(num, frame21.keyLs.get(index) + "/n", "r")
                num = num + 1
                self.keyTx.insert(num, "    " + str(self.t) + "/n")
                num = num + 1
                self.keyTx.insert(num, "/n")
                num = num + 1
                self.keyTx.insert(num, "    vaule: " + str(self.value))
                num = num + 1
                self.keyTx.insert(num, "/n")
                num = num + 1
                self.keyTx.insert(num, "/n")
                num = num + 1
                self.keyTx.insert(num, "    " + self.str)
                num = num + 1
           
            #選擇的是函式   
            elif index > frame21.fucStart and index < frame21.fucEnd:
                import os
                num = 1.0
               
#                str=frame11.inputEn.get()
#                l = str.split(".")
#                s = len(l)
#                print("al: ",l[s-1][0])
#                 #如果出現異常,說明最後一個分隔的字串一定不是模組
#                try:
#                    exec("import " + frame11.inputEn.get())
#                except:
#                    #去掉最後一個分隔重新匯入
#                    newl=l[0:s-1]
#                    newstr=""
#                    for var in newl:
#                        newstr=newstr+var
#                    exec("import "+newstr)
#                    print("newline: ",newstr)
               
                exec("import " + frame11.inputEn.get())
                exec("self.t=type(" + frame11.inputEn.get() + "." + frame21.keyLs.get(index) + ")")
                exec("self.value=" + frame11.inputEn.get() + "." + frame21.keyLs.get(index))
               
                import sys
                temp = sys.stdout
                sys.stdout = open("temp.txt", "w")
                exec("self.str=help(" + frame11.inputEn.get() + "." + frame21.keyLs.get(index) + ")")
                sys.stdout.flush()
                sys.stdout = temp
               
                self.keyTx.insert(num, frame21.keyLs.get(index) + "/n", "r")
                num = num + 1
                self.keyTx.insert(num, "    " + str(self.t) + "/n")
                num = num + 1
                self.keyTx.insert(num, "/n")
                num = num + 1
                self.keyTx.insert(num, "    vaule: " + str(self.value))
                num = num + 1
                self.keyTx.insert(num, "/n")
                num = num + 1
                self.keyTx.insert(num, "/n")
                num = num + 1
               
                file = open("temp.txt", "r")
                while True:
                    line = file.readline()
                    if len(line) == 0:
                        break
                    else: 
                        if line.find("(")!=-1 and line.find(")")!=-1 and line.startswith(" ")==False:
                            self.keyTx.insert(num, line, "b")
                            num=num+1
                        else:
                            self.keyTx.insert(num, line)
                            num = num + 1
                file.close()  
                num = num + 1 
               
            #選擇的是類   
            elif index > frame21.classStart and index < frame21.classEnd:
                import os
                exec("import " + frame11.inputEn.get())
                exec("self.t=type(" + frame11.inputEn.get() + "." + frame21.keyLs.get(index) + ")")
                exec("self.value=" + frame11.inputEn.get() + "." + frame21.keyLs.get(index))
                exec("self.str="+frame11.inputEn.get()+"."+frame21.keyLs.get(index)+".__doc__")
                exec("self._dir=dir("+frame11.inputEn.get()+"."+frame21.keyLs.get(index)+")")
                num = 1.0
                self.keyTx.insert(num, frame21.keyLs.get(index) + "/n", "r")
                num = num + 1
                self.keyTx.insert(num, "  "+"說明:"+self.str+"/n")
                num=num+1
                self.keyTx.insert(num, "  " + "型別:"+str(self.t) + "/n")
                num = num + 1
                self.keyTx.insert(num, "/n")
                num=num+1
                self.keyTx.insert(num, "  "+"功能:"+"/n")
                num=num+1
               
                for var in range(len(self._dir)):
                    if var%5 == 0:
                        self.keyTx.insert(num,"/n")
                        num=num+1
                        self.keyTx.insert(num, self._dir[var]+", ","b")
                        num=num+1
                    self.keyTx.insert(num,self._dir[var]+", ", "b")
                    num=num+1
               
               
                self.keyTx.insert(num,"/n")
                num=num+1
                self.keyTx.insert(num, "/n")
                num = num + 1
               
                self.keyTx.insert(num, "詳細: ")
                num = num + 1
                self.keyTx.insert(num, "/n")
                num = num + 1
                exec("self.l=dir(" + frame11.inputEn.get() + "." + frame21.keyLs.get(index) + ")")
               
                import sys
                temp = sys.stdout
                sys.stdout = open("class.txt", "w")
               
                for var in self.l:
                        exec("import " + frame11.inputEn.get())
                        exec("self.str=" + frame11.inputEn.get() + "." + frame21.keyLs.get(index) + "." + str(var) + ".__doc__")
                        print("  " + str(var) +": "+str(self.str))
                        print("-----------------------------------------------------")
                       
                sys.stdout.flush()
                sys.stdout = temp
                print(var)
                       
                file = open("class.txt", "r")
                while True:
                    line = file.readline()
                    if len(line) == 0:
                        break
                    else:
                        pos=line.find(":")
                        if pos != -1:
                            temp=line[0:pos]
                            line=line[pos:]
                            self.keyTx.insert(num,temp,"b")
                            self.keyTx.insert(num, line)
                            num=num+1
                        else:
                            self.keyTx.insert(num, line)
#                        self.keyTx.insert(num,temp,"r")
#                        print("pos: ",pos)
#                        print(str(int(num))+"."+str(pos))
#                        print("delete ",num+0.0,num+0.8)
#                        self.keyTx.insert(num, line)
#                        self.keyTx.insert(num,"insertastringskjfiewfiwejglksdmnlsijgois","r")
#                        self.keyTx.delete(str(num), str(int(num))+".10")
                        num = num + 1
                file.close()  
                num = num + 1   
   
frame11 = Frame11(root)
frame21 = Frame21(root)
frame12 = Frame12(root)
frame22 = Frame22(root)


root.mainloop()