一、pywebview
官网:https://pywebview.flowrl.com/
1、简介
pywebview声称Build GUI for your Python program with JavaScript, HTML, and CSS。就是可以利用web技能来实现桌面应用步伐开辟。其内核我明白仍然是浏览器,只不过将浏览器封装成体系窗口,如许就可以将web无缝切换到桌面应用,相比pyQt等重武器还是比较方便的。
对于目前比较火的electron,Python的参加给应用步伐提供了上限,据说打包的巨细也比electron小。
2、安装
Hello world 的demo:
- import webview
- webview.create_window('Hello world', 'https://pywebview.flowrl.com/')
- webview.start()
复制代码 3、依靠
windows步伐依靠pythonnet(要求 > .NET 4.0),pythonnet可以让python调用.NET代码。
为了利用最新版本的 Chromium(Chromium是谷歌的开源项目,国产的全部 “双核浏览器”,都是基于 Chromium 开辟的,乃至 Chrome 也是基于它。),需要安装WebView2。
选择Web应用还是原生应用来开辟是一种在通用性和本地权限之前的权衡。WebApp兼容的范围很广,而且Web前端代码基于浏览器天生跨平台,而且前端框架多好开辟。而原生应用有很大本地权限,可以举行各种文件和操作体系接口的调用。WebView可以联合这两者的优点举行开辟。WebView2允许你在本地App内里嵌入web相关的技能(例如HTML,CSS和JavaScript)。WebView2控件利用微软的Edge作为渲染引擎,你可以嵌入一部分或者整个App都用WebView来做。
WebView2下载地址:https://developer.microsoft.com/en-us/microsoft-edge/webview2/?form=MA13LH
4、利用
4.1、最简朴示例
- import webview
- window = webview.create_window('Woah dude!', 'https://pywebview.flowrl.com')
- webview.start()
复制代码
- create_window:
返回窗口实例,该实例可以利用很多窗口操作和DOM函数,可创建恣意数目窗口,在GUI循环启动后创建的窗口会立即显示。全部打开的窗口都以列表情势存储在webview.windows中。create_window第二个参数可以是url(长途url或本地url),也可设置html来加载html。html与url同时存在,html优先级高。
4.2、http server示例
pywebview提供一个与WSGI兼容的http服务器。
- import webview
- webview.create_window('Woah dude!', 'index.html')
- webview.start(http_server=True)
复制代码 将http_server设为true
一般利用外部WSGI兼容的http服务器,将服务器对象作为url转达
- from flask import Flask
- import webview
- server = Flask(__name__, static_folder='./assets', template_folder='./templates')
- webview.create_window('Flask example', server)
- webview.start()
复制代码 4.3、线程模子
webview.start会开启一个GUI循环,并且它是一个壅闭函数。当GUI循环被壅闭时,必须在一个单独的线程和进程中实行后端逻辑
。可以通过手动开启线程/进程,或者将函数作为要启动的第一个参数来启动。第二个参数设置函数的参数。这种方法会在后台启动一个线程,与手动起一个线程相同。
- import webview
- def custom_logic(window):
- window.evaluate_js('alert("welcome")')
- window = webview.create_window('Woah dude!', html='<h1>Woah dude!<h1>')
- webview.start(custom_logic, window)
- # anything below this line will be executed after program is finished executing
- print(2)#只有窗口关闭了才能打印
复制代码 4.4、Python与evaluate_js通讯
- 在Python调用Javascript
利用evaluate_js可以在Python中调用Javascript 函数,如:window.evaluate_js(‘alert(“welcome”)’)
- 在Javascript 中调用Python
方法1(非常反人类):在一个Python类中先写一个html网页,在其中的Javascript 利用pywebview.api.方法名来调用Python函数,方法名不能以下划线开头。示例如下:
方法二:将Python函数公开到Javascript域,示例如下:
- import webview
- def lol():
- print('LOL')
- def wtf():
- print('WTF')
- def echo(arg1, arg2, arg3):
- print(arg1)
- print(arg2)
- print(arg3)
- def expose(window):
- window.expose(echo) # expose a function during the runtime
- window.evaluate_js('pywebview.api.lol()')
- window.evaluate_js('pywebview.api.wtf()')
- window.evaluate_js('pywebview.api.echo(1, 2, 3)')
- if __name__ == '__main__':
- window = webview.create_window(
- 'JS Expose Example', html='<html><head></head><body><h1>JS Expost</body></html>'
- )
- window.expose(lol, wtf) # expose functions beforehand
- webview.start(expose, window, debug=True)
复制代码 方法三(最实用):
运行一个PythonWeb服务,让前端代码对其API举行调用。对于将Web一直到应用步伐非常便捷。
4.5、变乱
Windows对象有很多声明周期变乱,订阅变乱利用+=语法,即windows.events.loaded+=函数名,变乱触发时会调用该函数,不能重复订阅,多次订阅也只调用一次。取消订阅利用windows.events.loaded-=函数名。
- events.closed:窗口关闭后触发的变乱
- events.closing:窗口正在关闭,在确认时候触发的变乱
- events.loaded:DOM预备停其时触发的变乱
- events.minimized:窗口最小化触发的变乱
- events.restore:窗口恢复时触发的变乱
- events.maximized:窗口最大化触发的变乱
- events.resized:窗口巨细变化时触发的变乱
- events.shown:窗口显示时触发的变乱
5、常用示例
5.1、10秒后改变加载的url
- import time
- import webview
- def change_url(window):
- # wait a few seconds before changing url:
- time.sleep(10)
- # change url:
- window.load_url('https://pywebview.flowrl.com/hello')
- if __name__ == '__main__':
- window = webview.create_window('URL Change Example', 'http://www.google.com')
- webview.start(change_url, window)
复制代码 5.2、带有确认对话框的窗口
- import webview
- def open_confirmation_dialog(window):
- result = window.create_confirmation_dialog('Question', 'Are you ok with this?')
- if result:
- print('User clicked OK')
- else:
- print('User clicked Cancel')
- if __name__ == '__main__':
- window = webview.create_window(
- 'Confirmation dialog example', 'https://pywebview.flowrl.com/hello'
- )
- webview.start(open_confirmation_dialog, window)
复制代码 5.3、常用变乱
- import webview
- def on_closed():
- print('pywebview window is closed')
- def on_closing():
- print('pywebview window is closing')
- def on_shown():
- print('pywebview window shown')
- def on_minimized():
- print('pywebview window minimized')
- def on_restored():
- print('pywebview window restored')
- def on_maximized():
- print('pywebview window maximized')
- def on_resized(width, height):
- print(
- 'pywebview window is resized. new dimensions are {width} x {height}'.format(
- width=width, height=height
- )
- )
- def on_loaded():
- print('DOM is ready')
- # unsubscribe event listener
- webview.windows[0].events.loaded -= on_loaded
- webview.windows[0].load_url('https://pywebview.flowrl.com/hello')
- def on_moved(x, y):
- print('pywebview window is moved. new coordinates are x: {x}, y: {y}'.format(x=x, y=y))
- if __name__ == '__main__':
- window = webview.create_window(
- 'Simple browser', 'https://pywebview.flowrl.com/', confirm_close=True
- )
- window.events.closed += on_closed
- window.events.closing += on_closing
- window.events.shown += on_shown
- window.events.loaded += on_loaded
- window.events.minimized += on_minimized
- window.events.maximized += on_maximized
- window.events.restored += on_restored
- window.events.resized += on_resized
- window.events.moved += on_moved
- webview.start(debug=True)
复制代码 5.4、文件打开
- import webview
- def open_file_dialog(window):
- file_types = ('Image Files (*.bmp;*.jpg;*.gif)', 'All files (*.*)')
- result = window.create_file_dialog(
- webview.OPEN_DIALOG, allow_multiple=True, file_types=file_types
- )
- print(result)#result为文件的绝对路径
- if __name__ == '__main__':
- window = webview.create_window('Open file dialog example', 'https://pywebview.flowrl.com/hello')
- webview.start(open_file_dialog, window)
复制代码 5.5、文件保存
- import webview
- def save_file_dialog(window):
- import time
- time.sleep(5)
- result = window.create_file_dialog(
- webview.SAVE_DIALOG, directory='/', save_filename='test.file'
- )
- print(result)
- if __name__ == '__main__':
- window = webview.create_window('Save file dialog', 'https://pywebview.flowrl.com/hello')
- webview.start(save_file_dialog, window)
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |