先看运行效果:

任务栏显示,并支持右键菜单

按 Ctrl+Shift+Space 弹出聊天小窗(总在最前)
输入问题 → 逐字流式回复
关闭窗口后仍在系统托盘常驻,可随时热键召回
技术栈与思路
选择pywebview,主要是打包后的文件比较小,因为pywebview通过调用系统原生的 WebView 组件来渲染界面,原生内核一般是安装好的,所以不需要重复安装。
| 层级 | 选型 | 作用 |
|---|---|---|
| 桌面壳 | pywebview 4.x | 内嵌 Chromium,加载本地 HTML |
| 前端 | Vue3(CDN) | 数据绑定 + 流式渲染 |
| 托盘/热键 | pystray + keyboard | 常驻托盘 + 全局快捷键 |
| AI 请求 | openai 官方库 | 流式 SSE,逐句推送 |
| 打包 | pyinstaller | 单文件绿色 exe |
1. 安装依赖
# Python 3.8-3.11 虚拟环境 pip install pywebview pystray keyboard openai pyinstaller
2. 项目结构(单目录即可)

chat_desktop/ ├─ main.py # 入口(托盘+热键+webview) ├─ chat.html # Vue3 页面(CDN) ├─ chat.py # 与 OpenAI 通信的线程 └─ icon.ico # 托盘图标(16×16-64×64)
3. 核心代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>AI 聊天</title>
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
<style>
body{margin:0;font-family:Arial,Helvetica,sans-serif;background:#f5f5f5;}
#app{height:100vh;display:flex;flex-direction:column;}
.header{background:#07c160;color:#fff;padding:8px 12px;font-size:14px;}
.body{flex:1;overflow-y:auto;padding:10px;}
.bubble{margin:6px 0;max-width:80%;padding:8px 12px;border-radius:6px;}
.user{align-self:flex-end;background:#e1ffc7;}
.ai{align-self:flex-start;background:#fff;}
.footer{display:flex;border-top:1px solid #ddd;background:#fff;}
.footer input{flex:1;border:none;padding:10px;font-size:14px;outline:none;}
.footer button{width:70px;border:none;background:#07c160;color:#fff;cursor:pointer;}
</style>
</head>
<body>
<div id="app">
<div class="header">AI 助手</div>
<div class="body">
<div v-for="(m,i) in messages" :key="i" class="bubble" :class="m.role">
<div v-html="m.text"/>
</div>
</div>
<div class="footer">
<input v-model="question" @keyup.enter="send" placeholder="输入消息…">
<button @click="send">发送</button>
</div>
</div>
<script>
const { createApp, ref } = Vue;
createApp({
setup() {
const messages = ref([{role:'ai',text:'你好,我是 AI 助手~'}]);
const question = ref('');
const...点击查看剩余70%
网友评论0