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 base64 decode incorrect padding错误解决方法
Jan 08 Python
Python代码调试的几种方法总结
Apr 15 Python
Python xlrd读取excel日期类型的2种方法
Apr 28 Python
详解Python中的from..import绝对导入语句
Jun 21 Python
使用Python制作表情包实现换脸功能
Jul 19 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
详解Python3 pandas.merge用法
Sep 05 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
python datetime处理时间小结
Apr 16 Python
jupyter notebook更换皮肤主题的实现
Jan 07 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 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原生模板引擎 最简单的模板引擎
2012/04/25 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
nginx 设置多个站跨域
2021/03/09 Servers
jquery select下拉框操作的一些说明
2010/04/02 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
python下10个简单实例代码
2017/11/15 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
使用Python的turtle模块画国旗
2019/09/24 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
建筑个人求职信范文
2014/01/25 职场文书
小学四年级学生评语
2014/12/26 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
Python实现位图分割的效果
2021/11/20 Python
进行数据处理的6个 Python 代码块分享
2022/04/06 Python
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL
Vue router配置与使用分析讲解
2022/12/24 Vue.js