python 制作本地应用搜索工具


Posted in Python onFebruary 27, 2021

一.准备工作

请确保已经安装tkinter、pyperclip、threading

二.预览

1.启动

这是程序启动的主界面。

python 制作本地应用搜索工具

2.运行

搜索之后的界面。

python 制作本地应用搜索工具

3.结果

选择应用,右击鼠标复制它的下载链接。

python 制作本地应用搜索工具

三.设计思路

python 制作本地应用搜索工具

四.源代码

本次还是将GUI和搜索引擎分离开来,只要下面两个py文件在一个文件夹,结合已有的数据库就能实现上述功能。

4.1 GUI.py

from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from Search_Apps import Find_APP
import threading
import pyperclip
'''

-treeview显示搜索结果
-Menu绑定复制链接

'''
class App:
 def __init__(self):
  self.w=Tk()
  self.w.title('应用搜索工具(本地版)-v1.0')
  width=590
  height=395
  left=(self.w.winfo_screenwidth()-width)/2
  top=(self.w.winfo_screenheight()-height)/2
  self.w.resizable(0,0)
  self.w.geometry('%dx%d+%d+%d'%(width,height,left,top))
  self.create_widet()
  self.set_widget()
  self.place_widget()
  self.w.mainloop()

 def create_widet(self):
  self.l2_var=StringVar()
  self.l1=ttk.Label(self.w,text='关键字:')
  self.e1=ttk.Entry(self.w)
  self.b1=ttk.Button(self.w,text='搜索')
  self.tree=ttk.Treeview(self.w)
  self.S_coll_vertical = Scrollbar(self.w, orient=VERTICAL)
  self.l2=ttk.Label(self.w,textvariable=self.l2_var)
  self.m=Menu(self.w)
  self.w['menu']=self.m
  self.m2=Menu(self.tree,tearoff=False)

 def set_widget(self):
  self.b1.config(command=lambda :self.thread_it(self.search_app))
  self.e1.config(justify='center')
  columns=('no','app_name','app_cate','size','app_intro')
  self.tree.config(show='headings',columns=columns,selectmode=BROWSE,displaycolumns ='#all')
  self.tree.column("no", anchor="center",minwidth=40,width=40, stretch=NO)
  self.tree.column("app_name", anchor="center",minwidth=50,width=80, stretch=NO)
  self.tree.column("app_cate", anchor="center",minwidth=50,width=80, stretch=NO)
  self.tree.column("size", anchor="center",minwidth=50,width=80, stretch=NO)
  self.tree.column("app_intro", anchor="center",minwidth=10,width=100)
  self.tree.heading("no", text="序号")
  self.tree.heading("app_name", text="名称")
  self.tree.heading("app_cate", text="类别")
  self.tree.heading("size", text="大小")
  self.tree.heading("app_intro", text="介绍")
  self.tree.bind('<<TreeviewSelect>>',self.display_infos)
  self.S_coll_vertical.config(command=self.tree.yview)
  self.tree['yscrollcommand'] = self.S_coll_vertical.set
  self.l2.config(background='lightblue',justify='center')
  self.l2_var.set('请先搜索')
  self.s1=Menu(self.m,tearoff=False)
  self.s2=Menu(self.m,tearoff=False)
  self.m.add_cascade(label='操作',menu=self.s1)
  self.m.add_cascade(label='关于',menu=self.s2)
  self.s1.add_command(label='搜索',command=lambda :self.thread_it(self.search_app))
  self.s1.add_command(label='复制下载地址',command=lambda:self.thread_it(self.copy_apklink))
  self.s1.add_separator()
  self.s1.add_command(label='退出',command=self.quit_window)
  self.s2.add_command(label='说明',command=self.show_explain)
  self.s2.add_command(label='联系作者',command=self.show_info)
  self.w.protocol('WM_DELETE_WINDOW',self.quit_window)
  self.m2.add_command(label='复制链接',command=self.copy_apklink)
  self.tree.bind('<Button-3>',self.copy_link)

 def place_widget(self):
  self.l1.place(x=70,y=20)
  self.e1.place(x=150,y=20,width=250)
  self.b1.place(x=430,y=18)
  self.tree.place(x=10,y=60,width=570,height=300)
  self.S_coll_vertical.place(x=570,y=60,height=300)
  self.l2.place(x=10,y=367,width=570)

 def search_app(self):
  #清空treeview数据
  for item in self.tree.get_children():
   self.tree.delete(item)
  key_word=self.e1.get()
  if key_word:
   self.l2_var.set(f'正在检索......')
   self.data=Find_APP().search_app(key_word)
   if self.data:
    i=0
    for v in self.data:
     self.tree.insert('',i,values=(i+1,v.get('app_name'),v.get('app_cate'),v.get('size'),v.get('app_intro')))
     i+=1
    self.l2.config(background='lightblue')
    self.l2_var.set(f'一共检索到[{len(self.data)}]个关于[{key_word}]的应用')
   elif self.data is False:
    self.l2.config(background='red')
    self.l2_var.set(f'数据库连接失败,请检查数据库配置!')
   else:
    self.l2.config(background='green')
    self.l2_var.set(f'没有检索到关于[{key_word}]的应用')
  else:
   messagebox.showwarning('警告','请输入关键字!')
   self.l2.config(background='red')
   self.l2_var.set(f'请输入关键字!')

 def display_infos(self,event):
  #获取treeview当前选中项数据
  curr=self.tree.item(self.tree.focus()).get('values')
  #获取treeview当前选中项索引
  # curr_index = self.tree.index(self.tree.focus())
  # app=self.data[curr_index]
  self.l2_var.set(f'{curr[-1]}')

 def show_info(self):
  messagebox.showinfo('联系作者', '作者QQ:xxxx')

 def show_explain(self):
  messagebox.showinfo('说明', '\r本软件仅供学习,请勿用于商业用途\n\n1.在输入框输入关键字进行搜索\n2.选择应用右击提取下载地址')

 def copy_link(self,event):
  self.m2.post(event.x_root, event.y_root)

 def copy_apklink(self):
  try:
   curr_index = self.tree.index(self.tree.focus())
   app_link=self.data[curr_index].get('app_link')
   pyperclip.copy(app_link)
   messagebox.showinfo('提示','下载地址已成功复制到剪切板!')
  except AttributeError:
   messagebox.showwarning('警告','请先选中应用!')
   self.l2.config(background='red')
   self.l2_var.set('请先选中应用!')

 def quit_window(self):
  ret=messagebox.askyesno('退出','是否要退出?')
  if ret:
   self.w.destroy()

 def thread_it(self,func,*args):
  t=threading.Thread(target=func,args=args)
  t.setDaemon(True)
  t.start()

if __name__ == '__main__':
 a=App()

4.2 Search_Apps.py

import pymongo

class Find_APP(object):
 def __init__(self):
  self.Mongo_host='127.0.0.1'
  self.Mongo_port=27017

 def connect_db(self):
  try:
   conn=pymongo.MongoClient(host=self.Mongo_host,port=self.Mongo_port)
   self.db=conn.HuaWei
   self.myset=self.db.app_infos
   return True
  except:
   return False

 "{app_name: {$regex:/keyword/}}"#使用正则mongodb模糊查询
 def search_app(self,key_word):
  if self.connect_db():
   app_data=[]
   sentence={'app_name': {"$regex":key_word}}
   try:
    for i in self.myset.find(sentence):
     i.pop('_id')
     app_data.append(i)
    return app_data
   except :
    return False
  else:
   return False

五.总结

本次使用tkinter制作了一款应用搜索工具,使用其中的Treeview显示搜索结果,使用Menu绑定相关操作,通过执行Mongodb查询语句得到相关数据,所以要结合本地Mongodb数据库,整体执行效率高于网络接口访问,有机会的话,可能再发一篇通过接口得到数据的GUI,思路、代码方面有什么不足欢迎各位大佬指正、批评!

以上就是python 制作本地应用搜索工具的详细内容,更多关于python 制作应用搜索工具的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python+mysql实现简单的web程序
Sep 11 Python
python实现2048小游戏
Mar 30 Python
Python使用Django实现博客系统完整版
Sep 29 Python
Python基于opencv的图像压缩算法实例分析
May 03 Python
python3.5 email实现发送邮件功能
May 22 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
Python安装pycurl失败的解决方法
Oct 15 Python
浅谈Python批处理文件夹中的txt文件
Mar 11 Python
在pycharm中配置Anaconda以及pip源配置详解
Sep 09 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 Python
django ListView的使用 ListView中获取url中的参数值方式
Mar 27 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
如何用Python进行时间序列分解和预测
Mar 01 #Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 27 #Python
python FTP编程基础入门
Feb 27 #Python
python SOCKET编程基础入门
Feb 27 #Python
python 对xml解析的示例
Feb 27 #Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 #Python
pytorch __init__、forward与__call__的用法小结
Feb 27 #Python
You might like
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
PHP数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
Javascript Global对象
2009/08/13 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
python清除字符串里非字母字符的方法
2015/07/02 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
Python进行统计建模
2020/08/10 Python
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
专业毕业生个性的自我评价
2013/10/03 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL