pywebview使用指南

本文最后更新于:2023年6月8日 晚上

pywebview

img

介绍

根据官网介绍,pywebview 是一个轻量级的跨平台 GUI 框架,通过对 webview 组件包装来让 HTML 内容可以在平台对应的 GUI 上展示,可以把它想象成 Python 的 Electron ,不过它的体积要小得多。你可以用现代的 Web 开发技术来开发你的桌面应用,而无须关注原生平台的 GUI 细节。通过 pywebview ,可以选择你喜欢的 Python 轻量级 Web 框架如 Flask 或者 Bottle 来处理实际逻辑,由 pywebview 来负责 Python 和 DOM 之间的交互。

优点

直接调用本机浏览器内核,打包体积不特别大。

使用

安装

1
pip install pywebview

创建简单窗口

1
2
3
4
import webview

window = webview.create_window('Hello!', 'https://g-haoyu.top/') # 直接显示指定网页
webview.start()

调整窗口大小

1
2
3
4
5
6
7
8
def resize(window):

window.resize(420, 420)


if __name__ == '__main__':
window = webview.create_window('Resize window example', html='<h1>重设大小</h1>', width=800, height=600)
webview.start(resize, window)

更改网址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import webview
import time


def change_url(window):
# 等待两秒切换网址
time.sleep(2)

# 切换网址
window.load_url('https://cn.bing.com/search?q=2') # 第二个网址


if __name__ == '__main__':
window = webview.create_window('Hello', 'https://cn.bing.com/search?q=1') #第一个网址
webview.start(change_url, window)

对话框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import webview


def open_confirmation_dialog(window):
result = window.create_confirmation_dialog('title', '你好吗?')
if result:
print('点击了 确定')
else:
print('点击了 取消')


if __name__ == '__main__':
window = webview.create_window('hello', 'https://g-haoyu.top/')
webview.start(open_confirmation_dialog, window)

退出时的确认对话框

1
2
3
4
5
6
7
8
9
10
11
12
import webview

chinese = {
'global.quitConfirmation': u'确定关闭?',
} # 设置语言

if __name__ == '__main__':

webview.create_window('hello',
'https://g-haoyu.top/',
confirm_close=True)
webview.start(localization=chinese)

开启控制台

1
2
3
4
5
import webview

if __name__ == '__main__':
webview.create_window('Debug', 'https://g-haoyu.top/')
webview.start(debug=True) # 开启debug

右键单击某个元素,打开调试控制台。

销毁窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import webview
import time


def destroy(window):
# 显示窗口5秒后销毁窗口
time.sleep(5)
print('销毁窗口..')
window.destroy()
print('已销毁')


if __name__ == '__main__':
window = webview.create_window('Destroy', 'https://g-haoyu.top/')
webview.start(destroy, window)
print('窗口已被销毁')

事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import webview
import time


def on_closed():
print('窗口关闭')


def on_closing():
print('窗口关闭中')


def on_shown():
print('窗口显示')


def on_minimized():
print('窗口最小化')


def on_restored():
print('窗口还原')


def on_maximized():
print('窗口最大化')


def on_loaded():
print('DOM 加载完成')

# unsubscribe event listener
webview.windows[0].events.loaded -= on_loaded
webview.windows[0].load_url('https://g-haoyu.top/')


def on_resized(width, height):
print('窗口大小更改为 {width} x {height}'.format(width=width, height=height))


def on_moved(x, y):
print('窗口移动到 x: {x}, y: {y}'.format(x=x, y=y))


if __name__ == '__main__':
window = webview.create_window('hello', 'https://g-haoyu.top/', 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()

无框窗口

1
2
3
4
5
6
7
8
import webview


if __name__ == '__main__':
webview.create_window('Frameless window',
'https://g-haoyu.top/',
frameless=True)
webview.start()

可以通过拖动来移动窗口。
官网上这样说的,但是亲测不能通过拖动来移动窗口。

全屏窗口

1
2
3
4
5
6
7
8
import webview


if __name__ == '__main__':
webview.create_window('Full-screen window',
'https://g-haoyu.top/',
fullscreen=True)
webview.start()

隐藏/显示窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import webview
import time


def hide_show(window):
time.sleep(5)
window.hide()

time.sleep(5)
window.show()


if __name__ == '__main__':
window = webview.create_window('Hide / show window', 'https://g-haoyu.top/')
webview.start(hide_show, window)

本地化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import webview


if __name__ == '__main__':
localization = {
'global.quitConfirmation': u'你想退出吗?',
'global.ok': u'确定',
'global.quit': u'退出',
'global.cancel': u'取消',
'global.saveFile': u'保存文件',
'cocoa.menu.about': u'关于',
'cocoa.menu.services': u'服务',
'cocoa.menu.view': u'显示',
'cocoa.menu.hide': u'隐藏',
'cocoa.menu.hideOthers': u'隐藏其他',
'cocoa.menu.showAll': u'显示所有',
'cocoa.menu.quit': u'退出',
'cocoa.menu.fullscreen': u'进入全屏',
'windows.fileFilter.allFiles': u'所有文件',
'windows.fileFilter.otherFiles': u'其他文件类型',
'linux.openFile': u'打开文件',
'linux.openFiles': u'打开多个文件',
'linux.openFolder': u'打开文件夹',
}

webview.create_window('Localization Example', 'https://g-haoyu.top/')
webview.start(localization=localization)

更多请查看官网

结尾

写这篇文章时还发现了一个类似项目
Eel


pywebview使用指南
https://g-haoyu.top/2023/05/26/pywebview使用指南/
作者
Haoyu
发布于
2023年5月26日
更新于
2023年6月8日
许可协议