当前位置: 首页 > 科技观察

Python小技之不用 Gui,照样实现图形界面

时间:2023-03-12 04:04:16 科技观察

Python的小技巧不需要Gui,图形化界面照样可以实现程序后说:程序需要在内部(无)内部(网络)环境下运行...意思是Python环境不能安装!谁叫我们程序员啊,不就是开发个GUI版的吗,难为我了。。。。但是听到给的时间,我就不淡定了。。。为了不影响客户的评价,我可以只给一个星期!GUI的构思并不难,但需要梳理服务和与用户的交互界面。好吧,我们还得为GUI单独写界面,显然时间不够。不行,想想办法吧……要不,直接把web应用打包成可执行程序,拷贝到机器上运行,类似的框架还有很多,比如Nodejs中的Electron[1],Pywebview[2]]在Python中]。把原来的web程序打包,然后搞定!web程序是用Flask开发的,所以需要安装Python的Pywebview作为打包工具。创建虚拟环境[3]或在原Web项目环境中,执行:pipinstallpywebview在Windows系统下,需要.Net4.0或以上小测试:importwebviewwindow=webview.create_window('Hello!','http://http://www.justdopython.com')webview.start()引用webview库启动一个窗口,设置标题为Hello!,指定页面地址并启动webview,看到如下效果:一个小测试是惊人的!Pywebview支持三种模式,简单模式、服务器模式和线程模式。简单模式相当于一个自定义流浏览器,指定一个地址,即可浏览,如上例。服务器模式相当于包装了一个web应用,即会启动一个本地服务器,在定制的浏览器中浏览。线程模式更高级,就是需要你自己手动维护线程状态,才能实现更高级的玩法。目前的需求,我们选择服务器方式,也就是打包一个本地的web应用。连接到Flask服务器模式会为我们提供一个HTTPServer,只要web应用部署在上面即可。因为无非是为了展示实际项目的代码,这里做一个简单的Flask应用:关于FlaskWeb应用开发,可以参考作者写的Flask文章创建app.py文件:fromflaskimportFlask,render_template,jsonify,requestapp=Flask(__name__)#创建应用@app.route('/')defindex():#定义根目录处理程序returnrender_template('index.html')@app.route('/detail')defdetail():returnrender_template('detail.html')if__name__=='__main__':app.run()#启动服务这个应用很简单,只有两个页面,分别是分别通过/和/detail访问。如果运行此代码,将启动Flask应用程序并通过http://120.0.0.1:5000访问。如何在Pywebview中设置它?很简单:importwebviewfromappimportappif__name__=='__main__':window=webview.create_window('Pywebview',app,height=600,width=1000)webview.start()importwebviewimport刚才创建的app创建一个webview窗口,并将应用程序作为url参数传递,然后启动webview。这里的关键是使用Flask应用程序作为url参数。当Webview发现传入的参数是一个flask应用,就会启动服务模式。程序运行后可以看到和浏览器一样的效果:对接Flask目录的问题现在可以把这个项目打包成exe了。首先需要安装pyinstaller[4]pipinstallpyinstaller然后进入程序目录执行:pyinstall-F-wmain.pyF参数表示将程序打包成可执行文件。如果不加这个参数,会打包成一个文件夹。w参数表示在执行打包后的可执行程序时,不显示命令行窗口。此功能仅在Windows系统中可用。很快在程序目录下会生成一个dist文件夹,里面会有一个main.exe可执行文件。这是打包后的结果。双击运行,可以看到效果……等等,好像不是你想象的那样!Flask是怎么回事?根据提示,是因为找不到页面的模板文件。前面我们在创建Flaskapp的时候,使用的是默认的模板路径,即app.py文件所在目录的templates目录。为什么打包后找不到呢?这是因为在windows中,运行时的可执行文件,会被解压到特定的目录下,而我们的模板文件并没有打包成exe文件,所以运行时找不到模板文件。完美渲染是如何解决这个问题的?作为一个不使用外部数据或文件的程序,只需要对程序本身进行打包即可,但是大多数程序都需要外部数据,比如我们的Flask应用,就需要静态文件等。那么如何将它们打包成可执行文件呢?打包时多加一个参数即可:pyinstallermain.py-F-w--add-data"./templates/*;templates"--add-data参数表示添加附加数据--./templates/*表示添加当前目录下模板目录下的所有文件--;是分隔符,后面的templates表示解压这些数据的目录,目录名必须和template_folder参数和创建app时一样——如果需要使用静态文件,需要加上它们另外,例如--add-data"./static/*;static"以便可以将外部数据打包在一起。打包后,双击执行,你会发现网页完美呈现。注意:如果使用虚拟环境,必须在虚拟环境中单独安装pyinstaller,不能使用其他环境中已经安装的。这是为了打包打包,所以程序引用的模块在pyinstaller打包的时候是找不到的。引用模块不报错,但可能打包后的程序无法执行。总结经过一番折腾,终于在客户要求的时间之前完成了工作,很开心。回过头来看,得益于使用Python作为主要开发语言,因为Python强大的社区支持,没有找不到解决方案。这段经历的另一个启示是,当你遇到问题时,不要急着去做。大家可以想想有没有更好的办法,尤其是在使用Python的时候。比较!参考代码https://github.com/JustDoPython/python-examples/tree/master/taiyangxue/mazegame[1]Electron:https://www.electronjs.org/[2]Pywebview:https://pywebview.flowrl.com/[3]虚拟环境:https://mp.weixin.qq.com/s/WflK5pOKhvPg8zrf_W5mfw[4]pyinstaller:https://pyinstaller.readthedocs.io/en/stable/