用Python开发桌面端软件:pywebview (框架) + Python (后端) + vue (前端) + pyinstaller (打包)
遇到相关问题欢迎邮件交流(1554610593@qq.com),或评论区留言(不过回应会很慢)。
单兵简单开发,Python几乎可以满足所有需求。那么,2024年了,想写一个简单的windows桌面端软件,点击exe打开运行的那种,并且所有后端业务都用Python编写,应该怎么做?请看这个笔者用Python开发的用于微信群聊拍卖统价的桌面端软件:
效果是很好的,既美观又好用,并且所有的业务代码都是用Python写的(诸如管理数据库、读取和写入excel表格、计算竞价)。
用Python编写桌面GUI,可能最先想到的就是pyQt、Tkinter这种,但它们不是太臃肿,就是学习曲线高,而且功能局限,开发出的前端并不美观。
在开发前端方面,没有比Web网页开发更灵活强大的了,何况还有现成的web框架和海量的组件可以直接使用。但是,网页毕竟要在浏览器中打开,并不算一个封装好的桌面端软件。使用Electron倒是可以把网页浏览器伪装成一个桌面软件,但抛开学习成本不说,软件的业务层(也就是后端)是用node.js编写的,远没有Python灵活强大。
那么,2024年了,能不能用Web网页做前端,Python写后端,然后封装成一个桌面软件的样子呢?这样一来,只需要会Python和一点前端js框架,就可以写出一个美观又功能强大的桌面软件了。这就是笔者想推荐一种技术方案:pywebview (框架) + Python (后端) + vue (前端) + pyinstaller (打包)。目前也已经有大佬想到了这一套方案,并开发出了一个框架 PPX,方便大家直接在此基础上开发。笔者用这套方案很方便地开发出了桌面端软件。
这套方案在框架 PPX 中已经帮你跑通了,感兴趣的读者可以去仔细研究一下这个框架的源码,相信也能自己用Python捣鼓出一个桌面端软件。但其中肯定也会遇到一些坑,诸如笔者遇到过的这些:
try {
pywebview.api.xxx(params).then((res) => {
// ...处理后端返回的结果res...
console.log('成功执行');
}).catch((err) => {
// 如果Python执行抛出异常,会在这里处理
console.log(err.message)
})
} catch (err) {
// 如果js函数执行出错(如不存在xxx函数,或pywebview还没加载好)
// 会在这里处理
console.log(err.message)
}
runAfterPywebview(fn)
就可以确保fn在pywebview加载后再执行:
// 用于在检查pywebview加载完成后执行某个函数, timeInterval为检查间隔,timeLimit为检查超时时间
export function runAfterPywebview(fn, timeInterval = 100, timeLimit = 3000) {
let time2now = 0
let timer = setInterval(() => {
time2now += timeInterval
// 如果已经超时pywebview还没加载好,报错。
if (time2now > timeLimit) {
console.log({
message: 'pywebview加载超时',
showClose: true,
})
clearInterval(timer)
timer = null
return
}
// 没有超时,只有当pywebview加载好才执行fn。
if (window.pywebview != undefined) {
fn()
clearInterval(timer)
timer = null
return
}
}, timeInterval)
}
此外,还可能遇到其它问题,欢迎与笔者交流。
作者:小纛