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 相关文章推荐
wxPython事件驱动实例详解
Sep 28 Python
Django URL传递参数的方法总结
Aug 28 Python
python僵尸进程产生的原因
Jul 21 Python
使用Kivy将python程序打包为apk文件
Jul 29 Python
Python实现Kmeans聚类算法
Jun 10 Python
python之消除前缀重命名的方法
Oct 21 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
python与pycharm有何区别
Jul 01 Python
django rest framework 过滤时间操作
Jul 12 Python
Python编程源码报错解决方法总结经验分享
Oct 05 Python
python基础之//、/与%的区别详解
Jun 10 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
vue3.0 上手体验
2020/09/21 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
python简单实现操作Mysql数据库
2018/01/29 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
Python 爬虫的原理
2020/07/30 Python
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
nohup的用法
2014/08/10 面试题
个人查摆问题整改措施
2014/10/04 职场文书
承兑汇票转让证明怎么写?
2014/11/30 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
人与自然观后感
2015/06/16 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python