pywebview桌面步伐开辟(技能路线:前端+Python,全网独一份!!!!!!) ...

打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

一、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、安装

  1. pip install pywebview
复制代码
Hello world 的demo:
  1. import webview
  2. webview.create_window('Hello world', 'https://pywebview.flowrl.com/')
  3. 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、最简朴示例

  1. import webview
  2. window = webview.create_window('Woah dude!', 'https://pywebview.flowrl.com')
  3. 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服务器。
  1. import webview
  2. webview.create_window('Woah dude!', 'index.html')
  3. webview.start(http_server=True)
复制代码
将http_server设为true
一般利用外部WSGI兼容的http服务器,将服务器对象作为url转达
  1. from flask import Flask
  2. import webview
  3. server = Flask(__name__, static_folder='./assets', template_folder='./templates')
  4. webview.create_window('Flask example', server)
  5. webview.start()
复制代码
4.3、线程模子

webview.start会开启一个GUI循环,并且它是一个壅闭函数。当GUI循环被壅闭时,必须在一个单独的线程和进程中实行后端逻辑
。可以通过手动开启线程/进程,或者将函数作为要启动的第一个参数来启动。第二个参数设置函数的参数。这种方法会在后台启动一个线程,与手动起一个线程相同。
  1. import webview
  2. def custom_logic(window):
  3.     window.evaluate_js('alert("welcome")')
  4. window = webview.create_window('Woah dude!', html='<h1>Woah dude!<h1>')
  5. webview.start(custom_logic, window)
  6. # anything below this line will be executed after program is finished executing
  7. 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函数,方法名不能以下划线开头。示例如下:
    1. import random
    2. import sys
    3. import threading
    4. import time
    5. import webview
    6. html = """
    7. <!DOCTYPE html>
    8. <html>
    9. <head lang="en">
    10. <meta charset="UTF-8">
    11. <style>
    12.     #response-container {
    13.         display: none;
    14.         padding: 3rem;
    15.         margin: 3rem 5rem;
    16.         font-size: 120%;
    17.         border: 5px dashed #ccc;
    18.     }
    19.     label {
    20.         margin-left: 0.3rem;
    21.         margin-right: 0.3rem;
    22.     }
    23.     button {
    24.         font-size: 100%;
    25.         padding: 0.5rem;
    26.         margin: 0.3rem;
    27.         text-transform: uppercase;
    28.     }
    29. </style>
    30. </head>
    31. <body>
    32. <h1>JS API Example</h1>
    33. <p id='pywebview-status'><i>pywebview</i> is not ready</p>
    34. <button onClick="initialize()">Hello Python</button><br/>
    35. <button id="heavy-stuff-btn" onClick="doHeavyStuff()">Perform a heavy operation</button><br/>
    36. <button onClick="getRandomNumber()">Get a random number</button><br/>
    37. <label for="name_input">Say hello to:</label><input id="name_input" placeholder="put a name here">
    38. <button onClick="greet()">Greet</button><br/>
    39. <button onClick="catchException()">Catch Exception</button><br/>
    40. <div id="response-container"></div>
    41. <script>
    42.     window.addEventListener('pywebviewready', function() {
    43.         var container = document.getElementById('pywebview-status')
    44.         container.innerHTML = '<i>pywebview</i> is ready'
    45.     })
    46.     function showResponse(response) {
    47.         var container = document.getElementById('response-container')
    48.         container.innerText = response.message
    49.         container.style.display = 'block'
    50.     }
    51.     function initialize() {
    52.         pywebview.api.init().then(showResponse)
    53.     }
    54.     function doHeavyStuff() {
    55.         var btn = document.getElementById('heavy-stuff-btn')
    56.         pywebview.api.doHeavyStuff().then(function(response) {
    57.             showResponse(response)
    58.             btn.onclick = doHeavyStuff
    59.             btn.innerText = 'Perform a heavy operation'
    60.         })
    61.         showResponse({message: 'Working...'})
    62.         btn.innerText = 'Cancel the heavy operation'
    63.         btn.onclick = cancelHeavyStuff
    64.     }
    65.     function cancelHeavyStuff() {
    66.         pywebview.api.cancelHeavyStuff()
    67.     }
    68.     function getRandomNumber() {
    69.         pywebview.api.getRandomNumber().then(showResponse)
    70.     }
    71.     function greet() {
    72.         var name_input = document.getElementById('name_input').value;
    73.         pywebview.api.sayHelloTo(name_input).then(showResponse)
    74.     }
    75.     function catchException() {
    76.         pywebview.api.error().catch(showResponse)
    77.     }
    78. </script>
    79. </body>
    80. </html>
    81. """
    82. class Api:
    83.     def __init__(self):
    84.         self.cancel_heavy_stuff_flag = False
    85.     def init(self):
    86.         response = {'message': 'Hello from Python {0}'.format(sys.version)}
    87.         return response
    88.     def getRandomNumber(self):
    89.         response = {
    90.             'message': 'Here is a random number courtesy of randint: {0}'.format(
    91.                 random.randint(0, 100000000)
    92.             )
    93.         }
    94.         return response
    95.     def doHeavyStuff(self):
    96.         time.sleep(0.1)  # sleep to prevent from the ui thread from freezing for a moment
    97.         now = time.time()
    98.         self.cancel_heavy_stuff_flag = False
    99.         for i in range(0, 1000000):
    100.             _ = i * random.randint(0, 1000)
    101.             if self.cancel_heavy_stuff_flag:
    102.                 response = {'message': 'Operation cancelled'}
    103.                 break
    104.         else:
    105.             then = time.time()
    106.             response = {
    107.                 'message': 'Operation took {0:.1f} seconds on the thread {1}'.format(
    108.                     (then - now), threading.current_thread()
    109.                 )
    110.             }
    111.         return response
    112.     def cancelHeavyStuff(self):
    113.         time.sleep(0.1)
    114.         self.cancel_heavy_stuff_flag = True
    115.     def sayHelloTo(self, name):
    116.         response = {'message': 'Hello {0}!'.format(name)}
    117.         return response
    118.     def error(self):
    119.         raise Exception('This is a Python exception')
    120. if __name__ == '__main__':
    121.     api = Api()
    122.     window = webview.create_window('JS API example', html=html, js_api=api)
    123.     webview.start()
    复制代码
    方法二:将Python函数公开到Javascript域,示例如下:
    1. import webview
    2. def lol():
    3.     print('LOL')
    4. def wtf():
    5.     print('WTF')
    6. def echo(arg1, arg2, arg3):
    7.     print(arg1)
    8.     print(arg2)
    9.     print(arg3)
    10. def expose(window):
    11.     window.expose(echo)  # expose a function during the runtime
    12.     window.evaluate_js('pywebview.api.lol()')
    13.     window.evaluate_js('pywebview.api.wtf()')
    14.     window.evaluate_js('pywebview.api.echo(1, 2, 3)')
    15. if __name__ == '__main__':
    16.     window = webview.create_window(
    17.         'JS Expose Example', html='<html><head></head><body><h1>JS Expost</body></html>'
    18.     )
    19.     window.expose(lol, wtf)  # expose functions beforehand
    20.     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

  1. import time
  2. import webview
  3. def change_url(window):
  4.     # wait a few seconds before changing url:
  5.     time.sleep(10)
  6.     # change url:
  7.     window.load_url('https://pywebview.flowrl.com/hello')
  8. if __name__ == '__main__':
  9.     window = webview.create_window('URL Change Example', 'http://www.google.com')
  10.     webview.start(change_url, window)
复制代码
5.2、带有确认对话框的窗口

  1. import webview
  2. def open_confirmation_dialog(window):
  3.     result = window.create_confirmation_dialog('Question', 'Are you ok with this?')
  4.     if result:
  5.         print('User clicked OK')
  6.     else:
  7.         print('User clicked Cancel')
  8. if __name__ == '__main__':
  9.     window = webview.create_window(
  10.         'Confirmation dialog example', 'https://pywebview.flowrl.com/hello'
  11.     )
  12.     webview.start(open_confirmation_dialog, window)
复制代码
5.3、常用变乱

  1. import webview
  2. def on_closed():
  3.     print('pywebview window is closed')
  4. def on_closing():
  5.     print('pywebview window is closing')
  6. def on_shown():
  7.     print('pywebview window shown')
  8. def on_minimized():
  9.     print('pywebview window minimized')
  10. def on_restored():
  11.     print('pywebview window restored')
  12. def on_maximized():
  13.     print('pywebview window maximized')
  14. def on_resized(width, height):
  15.     print(
  16.         'pywebview window is resized. new dimensions are {width} x {height}'.format(
  17.             width=width, height=height
  18.         )
  19.     )
  20. def on_loaded():
  21.     print('DOM is ready')
  22.     # unsubscribe event listener
  23.     webview.windows[0].events.loaded -= on_loaded
  24.     webview.windows[0].load_url('https://pywebview.flowrl.com/hello')
  25. def on_moved(x, y):
  26.     print('pywebview window is moved. new coordinates are x: {x}, y: {y}'.format(x=x, y=y))
  27. if __name__ == '__main__':
  28.     window = webview.create_window(
  29.         'Simple browser', 'https://pywebview.flowrl.com/', confirm_close=True
  30.     )
  31.     window.events.closed += on_closed
  32.     window.events.closing += on_closing
  33.     window.events.shown += on_shown
  34.     window.events.loaded += on_loaded
  35.     window.events.minimized += on_minimized
  36.     window.events.maximized += on_maximized
  37.     window.events.restored += on_restored
  38.     window.events.resized += on_resized
  39.     window.events.moved += on_moved
  40.     webview.start(debug=True)
复制代码
5.4、文件打开

  1. import webview
  2. def open_file_dialog(window):
  3.     file_types = ('Image Files (*.bmp;*.jpg;*.gif)', 'All files (*.*)')
  4.     result = window.create_file_dialog(
  5.         webview.OPEN_DIALOG, allow_multiple=True, file_types=file_types
  6.     )
  7.     print(result)#result为文件的绝对路径
  8. if __name__ == '__main__':
  9.     window = webview.create_window('Open file dialog example', 'https://pywebview.flowrl.com/hello')
  10.     webview.start(open_file_dialog, window)
复制代码
5.5、文件保存

  1. import webview
  2. def save_file_dialog(window):
  3.     import time
  4.     time.sleep(5)
  5.     result = window.create_file_dialog(
  6.         webview.SAVE_DIALOG, directory='/', save_filename='test.file'
  7.     )
  8.     print(result)
  9. if __name__ == '__main__':
  10.     window = webview.create_window('Save file dialog', 'https://pywebview.flowrl.com/hello')
  11.     webview.start(save_file_dialog, window)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表