Python—使用tkinter制作python模块解析工具

15 篇文章 2 订阅

接触一个python模块,比如pandas,如何了解呢?可以dir(pandas),然后一大串方法,然后你一个个help慢慢学习,但这样显然太辛苦,效率太差了。咱这里写了一个脚本,可以直接页面方式学习python的新模块

#注意 需要安装 pip install quicktranslate 提供翻译功能
#-*- coding:utf-8 -*-
import requests,time,datetime
import tkinter as tk            #使用Tkinter前需要先导入
from tkinter import filedialog,messagebox,ttk
import importlib,sys
from quicktranslate import get_translate_baidu,get_translate_youdao,get_translate_google
import HTMLTestRunner

class MY_GUI(tk.Tk):
  #初始化
  def __init__(self):
    super().__init__()
    self.set_window()
    self.set_frame()
    self.set_body()
  #设置窗口
  def set_window(self):
    self.title("python模块解析工具")           #窗口名
    w_width=1200                             #工具宽度
    w_height=800                            #工具高度 
    scn_width=self.maxsize()[0]             #屏幕宽度
    x_point=(scn_width-w_width)//2          #取点让工具居中
    self.geometry('%dx%d+%d+%d' %(w_width,w_height,x_point,100))
    self.tk_focusFollowsMouse()
    self.bind("<Escape>",lambda event:window.iconify())
  #设置框架
  def set_frame(self):
    self.frame1=tk.Frame(self,pady=15,padx=15)
    self.frame1.grid(row=0,column=0,sticky='w')
    self.frame2=tk.Frame(self,pady=15,padx=15)
    self.frame2.grid(row=1,column=0,sticky='w')
    self.frame3=tk.Frame(self,pady=15,padx=15)
    self.frame3.grid(row=2,column=0,sticky='w')
  #设置组件
  def set_body(self): 
    modname=tk.StringVar()
    ttk.Label(self.frame1,text="输入模块名称:").grid(row=0,column=0,sticky='w')
    ttk.Entry(self.frame1,textvariable=modname).grid(row=0,column=1,sticky='w')
    ttk.Button(self.frame1,text="获取模块所有的属性",command=lambda:self.getmodinfo(modname.get())).grid(row=0,column=2,sticky='w')    
  #功能函数
  def getmodinfo(self,mod):  #参数为模块名称
    try:
      obj = importlib.import_module(mod) 
    except Exception as e:
      messagebox.showerror('错误',e)
      return False
    attrlist=[]
    for item in dir(obj):
      if not item.startswith('__'):
        attrlist.append(item)

    var=tk.StringVar()  
    chosen=ttk.Combobox(self.frame2,textvariable=var)
    chosen.grid(row=0,column=0,sticky='w')
    chosen['values']=attrlist
    chosen.current(0)   
    chosen.bind("<<ComboboxSelected>>",lambda event:self.getattrinfo(event,var.get(),obj))

  def getattrinfo(self,event,attr,obj):   #参数为模块下的属性名称
    cnt=getattr(obj,attr)            #模块下的变量
    ybar0=ttk.Scrollbar(self.frame2,orient='vertical')      #竖直滚动条 
    listbox=tk.Listbox(self.frame2,yscrollcommand=ybar0.set,selectmode=tk.BROWSE,height=20)
    ybar0['command']=listbox.yview       #和listbox联动
    for item in dir(cnt):
      if not item.startswith('__'):
        listbox.insert(0,item)

    listbox.grid(row=1,column=0,sticky='w')
    ybar0.grid(row=1,column=1,sticky='ns')
    listbox.bind('<Double-Button-1>',lambda event:self.getdetail(event,listbox,cnt))
    out=sys.stdout
    with open('dump.txt','w') as f:   #help cnt 输出到文件
      sys.stdout=f
      help(cnt)
      sys.stdout=out
                                                    
    ybar=ttk.Scrollbar(self.frame2,orient='vertical')    #模块下变量的帮助详情
    textarea=tk.Text(self.frame2,width=125,height=25,yscrollcommand=ybar.set)
    ybar['command']=textarea.yview
    textarea.grid(row=1,column=2,sticky='w')
    ybar.grid(row=1,column=3,sticky='ns')
    with open('dump.txt','r') as f:
      textarea.insert(1.0,f.read())

  def getdetail(self,event,lb,cnt):
    funcname=lb.get(lb.curselection())   #要查询的函数
    func=getattr(cnt,funcname)
    out=sys.stdout
    with open('dump1.txt','w') as f:   #help func 输出到文件
      sys.stdout=f
      help(func)
      sys.stdout=out

    with open('dump1.txt','r') as f:    #读取文件
      text_f=f.read()

    ybar1=ttk.Scrollbar(self.frame3,orient='vertical')   #左边的文本框
    ybar2=ttk.Scrollbar(self.frame3,orient='vertical')   #右边的文本框
    textarea1=tk.Text(self.frame3,width=70,height=23,yscrollcommand=ybar1.set)  #area1->ybar2
    textarea2=tk.Text(self.frame3,width=70,height=23,yscrollcommand=ybar2.set)
    ybar1['command']=textarea1.yview
    ybar2['command']=textarea2.yview
    textarea1.grid(row=0,column=0,sticky='w')
    ybar1.grid(row=0,column=1,sticky='ns')
    ttk.Button(self.frame3,width=5,text="翻译",command=lambda:self.translate(text_f,textarea2)).grid(row=0,column=2)
    textarea2.grid(row=0,column=3,padx=10)
    ybar2.grid(row=0,column=4,sticky='ns')
    textarea1.insert(1.0,text_f)
  
  def translate(self,text_f,textarea2):
    test_url='http://youdao.com'
    try:
      requests.get(test_url,timeout=2)
    except:
      return ''
    texts=text_f.split('\n')      #段落分割
    strs=""
    for paragraph in texts:
      if(paragraph):
        sentences=paragraph.split('.') #句子
        for sentence in sentences:
          if(sentence):
            strs+=get_translate_youdao(sentence)+"."
      strs+="\n"
    textarea2.insert(1.0,strs)

app=MY_GUI()
app.mainloop()

用法 输入模块 pandas 查到底下的属性 比如 DataFrame ,
再选择DataFrame 通过下拉框显示下面的属性和方法 同时在左框显示help(DataFrame)的结果 再双击下面的方法 比如 to_sql 于是在下框显示help(to_sql)的结果 点击翻译按钮就翻译了

效果
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值