摘要
本文演示通过python创建桌面应用程序的过程,并打包成exe运行在wins环境下,实现输入框+按钮完成百度资讯的搜索结果展示。
效果展示
用到的库
第三方库: pystray, PIL, pywin32, DrissionPage
内置库: tkinter, threading
-
pystray: 用于创建系统托盘图标。通过它可以将程序最小化到系统托盘,并在托盘上显示图标和菜单,方便用户在后台运行程序或通过托盘图标进行操作。
-
PIL: Python的图像处理库,Image模块用于加载、处理和保存图像文件。
-
win32gui: pywin32包的一部分,提供了对Windows系统底层API的访问,可以用来操作窗口(如获取窗口句柄、隐藏窗口等)。
-
win32con: pywin32包的一部分,主要包含Windows系统中定义的各种常量。
-
DrissionPage: 用于控制Chrome浏览器进行网页自动化操作。
-
tkinter: Python的标准GUI(图形用户界面)库,用于创建窗口、按钮、文本框等GUI组件。代码中从tkinter导入的各类组件(如Tk,Entry,Button,Frame,END,Text,Scrollbar)都是用于构建图形界面的工具。
-
threading: 提供线程支持,用于在程序中创建和管理线程。
实现代码
百度接口调用及解析部分
# 搜索百度并显示结果
def search_baidu():
query = entry.get()
ifnot query:
messagebox.showwarning("警告", "请输入搜索内容")
return
try:
# 设置无头模式
co = ChromiumOptions().headless()
tab = Chromium(co).latest_tab
# 访问百度搜索
tab.get(f"https://www.baidu.com/s?tn=news&rtt=1&bsst=1&wd={query}&cl=2")
# 提取搜索结果(百度结果页中每条摘要)
results = tab.eles('.news-title_1YtI1 ')
text_area.delete(1.0, END)
ifnot results:
text_area.insert(END, "未找到相关内容")
else:
for result in results:
a = result.ele('tag:a') #通过 tag:a 获取 a 标签
title = a.text.strip()
link = a.attr('href') # 直接取 href 属性
text_area.insert(END, f'标题:{title}\n地址:{link}\n\n')
except Exception as e:
messagebox.showerror("错误", f"搜索失败: {e}")
完整代码
我的桌面程序.py
import pystray
from tkinter import Tk, Entry, Button, Frame, END, Text, Scrollbar, messagebox
from PIL import Image
import threading
import win32gui
import win32con
from DrissionPage import Chromium, ChromiumOptions
tk = Tk() # 创建一个窗口
image = Image.open("coffeebeans.ico") # 打开图标图片文件
desk_icon = pystray.Icon("desk_icon", image, "我的桌面程序") # 创建一个系统托盘图标,指定图标名称、图片和标题
# 创建窗口
def create_window(carrier, width, height, title):
screenWidth = carrier.winfo_screenwidth() # 获取屏幕宽度
screenHeight = carrier.winfo_screenheight() # 获取屏幕高度
size_geo = '%dx%d+%d+%d' % (width, height, (screenWidth - width) / 2, (screenHeight - height) / 2) # 计算窗口位置
carrier.geometry(size_geo) # 设置窗口大小
carrier.title(title) # 设置窗口标题
carrier.resizable(0, 0) # 设置窗口不可缩放
# 隐藏窗口
def withdraw_window():
tk.withdraw()
# 显示窗口
def show_window():
desk_icon.visible = True
tk.deiconify()
# 关闭窗口
def exit_window():
desk_icon.stop() # 停止图标运行,退出系统托盘
tk.quit() # 退出程序
tk.destroy() # 销毁窗口
# 创建任务栏图标
def create_icon():
def on_exit():
exit_window() # 停止图标运行,退出系统托盘
def on_open():
show_window() # 显示窗口
def on_about():
print("关于信息") # 打印消息,表示显示关于信息
# 创建菜单
menu = pystray.Menu(
pystray.MenuItem('打开主界面', on_open), # 创建一个菜单项,标题为 "打开主界面",点击时调用 on_open 函数
pystray.MenuItem('关于', on_about), # 创建一个菜单项,标题为 "关于",点击时调用 on_about 函数
pystray.MenuItem('退出', on_exit) # 创建一个菜单项,标题为 "退出",点击时调用 on_exit 函数
)
desk_icon.menu = menu # 将菜单设置到图标上
desk_icon.run() # 运行图标
# 搜索百度并显示结果
def search_baidu():
query = entry.get()
if not query:
messagebox.showwarning("警告", "请输入搜索内容")
return
try:
# 设置无头模式
co = ChromiumOptions().headless()
tab = Chromium(co).latest_tab
# 访问百度搜索
tab.get(f"https://www.baidu.com/s?tn=news&rtt=1&bsst=1&wd={query}&cl=2")
# 提取搜索结果(百度结果页中每条摘要)
results = tab.eles('.news-title_1YtI1 ')
text_area.delete(1.0, END)
if not results:
text_area.insert(END, "未找到相关内容")
else:
for result in results:
a = result.ele('tag:a') #通过 tag:a 获取 a 标签
title = a.text.strip()
link = a.attr('href') # 直接取 href 属性
text_area.insert(END, f'标题:{title}\n地址:{link}\n\n')
except Exception as e:
messagebox.showerror("错误", f"搜索失败: {e}")
# 创建窗口控件
frame = Frame(tk)
frame.pack(padx=10, pady=10)
entry = Entry(frame, width=30)
entry.pack(side='left')
button = Button(frame, text="搜索", command=search_baidu)
button.pack(side='right')
text_area = Text(tk, wrap='word', height=10)
text_area.pack(expand=True, fill='both')
scrollbar = Scrollbar(text_area)
scrollbar.pack(side='right', fill='y')
text_area.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=text_area.yview)
if __name__ == "__main__":
# 通过窗口名称获取窗口句柄
find_win = win32gui.FindWindow(None, "我的桌面程序")
if find_win != 0:
win32gui.ShowWindow(find_win, win32con.SW_SHOW) # 显示窗口
win32gui.SetForegroundWindow(find_win) # 设置窗口为前台窗口
else:
create_window(tk, 800, 400, "我的桌面程序")
threading.Thread(target=create_icon).start() # 创建任务栏图标
tk.protocol("WM_DELETE_WINDOW", withdraw_window) # 隐藏窗口
tk.mainloop()
打包成exe并测试
pyinstaller --onefile --icon=coffeebeans.ico 我的桌面程序.py
总结
以上我们了解了如何利用python第三方库pystray, PIL, pywin32, DrissionPage以及内置库tkinter, threading完成了一次exe桌面程序的开发,用于桌面小工具的实现具有不错的意义,也说明了pytyon的跨平台性很强。
关注公众号:咖啡Beans
在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。