如何实现pywebview无边框窗口可调整大小、支持贴边及加载本地src文件
本地资源加载解决方案
使用load_html方法时无法加载本地资源,是因为该方法加载的HTML没有指定基础路径,浏览器内核无法解析相对路径的本地资源,可通过两种方案解决:
- 方案1:传入
base_uri参数指定资源根目录load_html方法支持第二个参数base_uri,将你本地资源存放的根目录的绝对路径传入即可正常解析相对路径资源。修改后的示例代码如下:
import webview import os # 获取当前脚本所在目录作为资源根目录 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) html = """ <!DOCTYPE html> <html lang="en"> <h1>This is dynamically loaded HTML</h1> <body> <img src="images/dots.svg"> image should be here </body> </html> """ def load_html(window): # 传入base_uri参数 window.load_html(html, base_uri=BASE_DIR) if __name__ == '__main__': window = webview.create_window('Load HTML Example', html=html, base_uri=BASE_DIR) webview.start(load_html, window)
- 方案2:将资源转换为Base64嵌入HTML
如果需要完全单文件打包无外部依赖,可把所有本地资源读取后转成Base64编码,直接写入HTML的src属性中,无需额外路径配置。示例逻辑如下:
import base64 # 读取本地图片转Base64 with open("images/dots.svg", "rb") as f: img_b64 = base64.b64encode(f.read()).decode() # 拼接到HTML的src属性 html = f'<img src="data:image/svg+xml;base64,{img_b64}">'
Windows窗口贴边功能解决方案
如果使用的是pywebview默认带边框窗口,系统原生支持Win+方向键贴边功能,无需额外配置。如果使用无边框窗口导致该特性丢失,可通过调用Windows原生API修改窗口样式保留系统窗口行为,步骤如下:
- 安装依赖:
pip install pywin32 - 窗口创建后修改窗口样式,保留系统窗口的拖拽、贴边、最大化等特性,示例代码如下:
import webview import win32gui import win32con def adjust_window_style(window): hwnd = window.hwnd # 获取当前窗口样式 style = win32gui.GetWindowLongPtr(hwnd, win32con.GWL_STYLE) # 添加可调边框、最大化最小化按钮属性,保留系统窗口行为 style |= win32con.WS_THICKFRAME | win32con.WS_MAXIMIZEBOX | win32con.WS_MINIMIZEBOX win32gui.SetWindowLongPtr(hwnd, win32con.GWL_STYLE, style) if __name__ == '__main__': # 创建无边框窗口 window = webview.create_window('Aero Snap Example', html='<h1>Test</h1>', frameless=True) webview.start(adjust_window_style, window)
修改后无边框窗口可正常使用Win+方向键贴边、拖动到屏幕边缘吸附、拖动到顶部最大化等系统原生窗口特性。
内容的提问来源于stack exchange,提问作者tokageKitayama
相关产品推荐
相关产品推荐

