中国软件网

您现在的位置是:网站首页>软件头条

软件头条

太赞了!别再说 不能用Python开发美观的GUI程序了!

中国软件网2023-05-07软件头条fan墙软件
测车速的软件,fan墙软件,位置穿越软件,太赞了!别再说不能用Python开发美观的GUI程序了!,测车速的软件,fan墙软件,位置穿越软件TkinterDesigner需要学习Figma这款设计软件如何使用,其美化GUI的原理

太赞了!别再说 不能用Python开发美观的GUI程序了!

太赞了!别再说 不能用Python开发美观的GUI程序了!,

  测车速的软件,fan墙软件,位置穿越软件Tkinter Designer需要学习Figma这款设计软件如何使用,其美化GUI的原理就是用图片去填充,从而让Tkinter有比较美观的样式,抱歉,我暂时还不想学Figma。

  而另外一个方案:TTk Bootstrap其实是更大的坑,如果你只是开发单窗口GUI软件,TTkBootstrap挺好的,但当你有开启一个窗口后,关闭并开启另外一个新窗口的需求时,TTKBoostrap就是一个大坑,新的窗口会丢失掉相应的样式。

  我希望Python生态中有类似Electron的库,让我们可以利用HTML、CSS、JS来构建前端页面,而后端的逻辑使用Python来实现,这样就可以轻松构建出美观的GUI了。

  有我微信好友的朋友应该知道,上两周我帮助大家将视频一键同步到6个不同的媒体平台,这个软件便使用PyWebView框架开发,软件界面如下:

  PyWebView可以让你通过HTML、CSS、JS来构建GUI的前端页面,使用Python来实现软件中的业务逻辑,再配合使用Pyinstaller实现软件打包,便可以构建一个美观的GUI应用了。

  遗憾的是PyWebView资料比较少,Github的star数也不多,我实际操作下来,有些Windows平台无法打开,因精力有限,也没有去深究为何无法打开。

  本文便简单介绍PyWebView的使用方法,相比于官方文档,会突出其中遇到的坑和相应的解决方案,也算是视频同步助手这个项目的技术复盘吧(嗯,变现阶段失败了,所以)。

  光读PyWebView的文档,是比较难起步的,比较好的方式是去PyWebView的github中将源码拉下来,其中有example目录,提供了一下例子项目,其中要搞懂的核心逻辑是,前端JS写的逻辑,怎么去与Python互通。

  在实例化webview时,将定义好的Api类实例作为js_api的参数传入:

  因为我们项目在启动时,开启了debug模式,所以可以按F12打开浏览器的DevTools,在控制台中,可以轻松打印出window.pywebview中各种属性,其中的api属性包含了Python中Api类提供的所有方法。

  JS api对于一些比较复杂的需求不太好用,此时可以使用HTTP服务的形式,具体而言,利用Flask开启一个web服务,前端的操作通过HTTP请求来调用该Web服务。

  前端JS通过Ajax的形式,请求Flask提供的接口,从而让后端执行相关的逻辑,如果没有使用Vue、React等框架时,我个人便习惯使用Jquery提供的ajax方法,并在该方法基础上再封装多一层。

  # 判断前端传递token是否与webview.token一致,从而校验请求是否合法

  在开发视频同步助手时,为了方便,没有使用Vue+PyWebView的形式,即我无法使用类似vue-router的东西来实现页面变化的效果,那要怎么弄呢?

  为了实现页面的变化,我将侧边栏这些都写到base.html中,然后通过Flask模板继承的能力避免每个页面中都弄个侧边栏。

  当我们要访问不同页面时,发现PyWebView不允许你通过render_template方法获得新页面,PyWebView要实现页面更新只有两种方式,一是使用load_url方法,提供一个url,webview会去加载新的页面,另一种是使用load_html方法,该方法会加载html文件。

  遗憾的是,load_html方法加载html时,不会执行html中引入的JS,所以我们只能通过load_url方法去做。

  回顾一下PyWebView HTTP服务的使用,我们利用Flask构建了web实例,但Web实例启动后监听的端口这些是由PyWebView随机分配的,我们无法获得,而load_url方法需要完整的url才能获取。

  为了解决这个问题,只能在PyWebView刚启动时,将url记录起来,然后再利用记录的url拼接出完整的URL,实现页面的切换。

  PyWebView启动后,如果开启了HTTP服务,会默认访问根路径,我们在这里记录一下url:

  通过这种方式,利用了PyWebView的load_url方法,成功加载新页面,实现页面的切换,页面中的JS也可以正常执行。

  用户需要添加自己的视频到无感同步助手中,会发现,视频元素无法显示,其原因在于,视频可能在用户系统的任意位置,当前Flask构建的web服务因为安全沙箱的原因,无法读取系统中任意位置的元素并返回。

  我们是否可以为Flask添加多个static,从而实现让Flask可以访问系统中任意元素的效果呢?嗯,可以的,利用Flask提供的send_from_directory方法。

  无感同步助手的业务逻辑中,有开启新Tab页面的需求,网上常见的解决方法为:

  正常而言,这会开启一个新的Tab,但Chrome为了避免网站恶意开启新的Tab,默认是不允许纯JS开启新Tab的操作的。

  怎么解决?翻了大半天Chrome的文档,才知道维护window.open无效以及解决方法。

  PyWebView会使用系统自带的浏览器内核来给你的GUI程序提供前端展示,而Electron是自己打包进一个Chromium,所以PyWebView打包会小一点,但稳定性上,个人体验下来,比Electron差上一些。

  此外,Pyinstaller打包也是一个大坑,后续有空,再将Pyinstaller的各种实践技巧补上。

  入门:最全的零基础学Python的问题零基础学了8个月的Python实战项目学Python就是这条捷径

  干货:爬取豆瓣短评,电影《后来的我们》38年NBA最佳球员分析从万众期待到口碑扑街!唐探3令人失望笑看新倚天屠龙记 灯谜答题王 |用Python做个海量小姐姐素描图 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

  AI:会做诗的机器人 给图片上色 预测收入 碟中谍这么火,我用机器学习做个迷你推荐系统电影

  小工具:Pdf转Word,轻松搞定表格和水印!一键把html网页保存为pdf!再见PDF提取收费!用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换制作一款钉钉低价机票提示器!|60行代码做了一个语音壁纸切换器天天看小姐姐!|

很赞哦!