wxpython:wx.html2 是好用的 WebView 组件

wxpython : wx.html2 是好用的 WebView 组件。

wx.html2 是wxPython扩展模块中封装得干净漂亮的模块之一,它被设计为允许为每个端口创建多个后端,尽管目前只有一个可用。它与wx.html.HtmlWindow 的不同之处在于,每个后端实际上都是一个完整的渲染引擎,MSW上是Trident, macOS和GTK上是Webkit。wx.html2渲染web文档,对于HTML、CSS和 Javascript都可以有很好的支持。与 CEF 相比,还是有些不足,比如对HTML5 的 audio, video 就支持不好。

pip install wxpython==4.2
wxPython-4.2.0-cp37-cp37m-win_amd64.whl (18.0 MB)
Successfully installed wxpython-4.2.0

cd \Python37\Scripts

wxdemo.exe 取得 wxPython-demo-4.2.0.tar.gz

wxdocs.exe 取得 wxPython-docs-4.2.0.tar.gz

编写 wx_html2.py 如下

# -*- coding: utf-8 -*-
import os
import sys
import wx
import wx.html2 as wbv# WebView Backends
backends = [(wbv.WebViewBackendEdge, 'WebViewBackendEdge'),(wbv.WebViewBackendIE, 'WebViewBackendIE'),(wbv.WebViewBackendWebKit, 'WebViewBackendWebKit'),(wbv.WebViewBackendDefault, 'WebViewBackendDefault'),
]#----------------------------------------------------------------------
class TestPanel(wx.Panel):def __init__(self, parent, id, frame=None):wx.Panel.__init__(self, parent, -1)self.current = "http://localhost:8888"self.frame = frameif frame:self.titleBase = frame.GetTitle()sizer = wx.BoxSizer(wx.VERTICAL)btnSizer = wx.BoxSizer(wx.HORIZONTAL)# The Internet Explorer emulation level is a persistent per-user and# per-application value.wbv.WebView.MSWSetEmulationLevel(wbv.WEBVIEWIE_EMU_IE11)# If you would like to reset it back to the default (no-emulation) then# it can be done by calling this:# wbv.WebView.MSWSetEmulationLevel(wbv.WEBVIEWIE_EMU_DEFAULT)# Find an available backendbackend = Nonefor id, name in backends:available = wbv.WebView.IsBackendAvailable(id)print("Backend 'wx.html2.{}' availability: {}\n".format(name, available))if available and backend is None:backend = idprint("Using backend: '{}'\n".format(str(backend, 'ascii')))# Create the WebViewself.wv = wbv.WebView.New(self, backend=backend)self.Bind(wbv.EVT_WEBVIEW_NAVIGATING, self.OnWebViewNavigating, self.wv)self.Bind(wbv.EVT_WEBVIEW_LOADED, self.OnWebViewLoaded, self.wv)btn = wx.Button(self, -1, "Open", style=wx.BU_EXACTFIT)self.Bind(wx.EVT_BUTTON, self.OnOpenButton, btn)btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)btn = wx.Button(self, -1, "<--", style=wx.BU_EXACTFIT)self.Bind(wx.EVT_BUTTON, self.OnPrevPageButton, btn)btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)self.Bind(wx.EVT_UPDATE_UI, self.OnCheckCanGoBack, btn)btn = wx.Button(self, -1, "-->", style=wx.BU_EXACTFIT)self.Bind(wx.EVT_BUTTON, self.OnNextPageButton, btn)btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)self.Bind(wx.EVT_UPDATE_UI, self.OnCheckCanGoForward, btn)btn = wx.Button(self, -1, "Stop", style=wx.BU_EXACTFIT)self.Bind(wx.EVT_BUTTON, self.OnStopButton, btn)btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)btn = wx.Button(self, -1, "Refresh", style=wx.BU_EXACTFIT)self.Bind(wx.EVT_BUTTON, self.OnRefreshPageButton, btn)btnSizer.Add(btn, 0, wx.EXPAND|wx.ALL, 2)txt = wx.StaticText(self, -1, "Location:")btnSizer.Add(txt, 0, wx.CENTER|wx.ALL, 2)self.location = wx.ComboBox(self, -1, "", style=wx.CB_DROPDOWN|wx.TE_PROCESS_ENTER)self.location.AppendItems(['https://fanyi.baidu.com/','https://cn.bing.com/','https://fanyi.sogou.com/'])self.Bind(wx.EVT_COMBOBOX, self.OnLocationSelect, self.location)self.location.Bind(wx.EVT_TEXT_ENTER, self.OnLocationEnter)btnSizer.Add(self.location, 1, wx.EXPAND|wx.ALL, 2)sizer.Add(btnSizer, 0, wx.EXPAND)sizer.Add(self.wv, 1, wx.EXPAND)self.SetSizer(sizer)self.wv.LoadURL(self.current)def ShutdownDemo(self):# put the frame title backif self.frame:self.frame.SetTitle(self.titleBase)# WebView eventsdef OnWebViewNavigating(self, evt):# this event happens prior to trying to get a resourceif evt.GetURL() == 'http://www.microsoft.com/':if wx.MessageBox("Are you sure you want to visit Microsoft?",style=wx.YES_NO|wx.ICON_QUESTION) == wx.NO:# This is how you can cancel loading a page.evt.Veto()def OnWebViewLoaded(self, evt):# The full document has loadedself.current = evt.GetURL()self.location.SetValue(self.current)# Control bar eventsdef OnLocationSelect(self, evt):url = self.location.GetStringSelection()print('OnLocationSelect: %s\n' % url)self.wv.LoadURL(url)def OnLocationEnter(self, evt):url = self.location.GetValue()self.location.Append(url)self.wv.LoadURL(url)def OnOpenButton(self, event):dlg = wx.TextEntryDialog(self, "Open Location","Enter a full URL or local path","http://", wx.OK|wx.CANCEL)dlg.CentreOnParent()if dlg.ShowModal() == wx.ID_OK:self.current = dlg.GetValue()self.wv.LoadURL(self.current)dlg.Destroy()def OnPrevPageButton(self, event):self.wv.GoBack()def OnNextPageButton(self, event):self.wv.GoForward()def OnCheckCanGoBack(self, event):event.Enable(self.wv.CanGoBack())def OnCheckCanGoForward(self, event):event.Enable(self.wv.CanGoForward())def OnStopButton(self, evt):self.wv.Stop()def OnRefreshPageButton(self, evt):self.wv.Reload()class MyFrame(wx.Frame):    def __init__(self):super().__init__(parent=None, title='wx.html2 示例', size=(1000, 600))self.panel = TestPanel(self, wx.ID_ANY)self.Show(True)if __name__ == '__main__':app = wx.App(False) # False: 意味着不重定向标准输出和错误输出到窗口上frame = MyFrame()app.MainLoop()

运行 python wx_html2.py 

参考: wxpython事件绑定方法的选择和应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中<iostream> 的cin >> str 和<string>的getline(cin, str) 用来读取用户输入的两种不同方式的不同点

C中<iostream> 的cin >> str 和<string>的getline(cin, str) 用来读取用户输入的两种不同方式的不同点 &#xff1c;string&#xff1e;的getline()函数语法如下【https://cplusplus.com/reference/string/string/getline/】&#xff1a; istream& getl…

抖音seo短视频矩阵系统源码开发源代码分享--开源-可二开

适用于抖音短视频seo矩阵系统&#xff0c;抖音矩阵系统源码&#xff0c;短视频seo矩阵系统源码&#xff0c;短视频矩阵源码开发&#xff0c;支持二次开发&#xff0c;开源定制&#xff0c;招商加盟SaaS研发等。 功能开发设计 1. AI视频批量剪辑&#xff08;文字转语音&#x…

官方项目《内容示例》中Common UI部分笔记: 1.1 Activatable Widgets

本文主要面向UMG以及Common UI的初学者 文章目录 效果展示概要Activate和Deactivate可见性绑定UI动画设置Common Activatable Widget的默认焦点 效果展示 概要 这个例子非常简单&#xff0c;定义了13个Common Activatable Widget CommonUI_ActivatableWidgets相当于一个容器包…

LLM本地知识库问答系统(一):使用LangChain和LlamaIndex从零构建PDF聊天机器人指南

随着大型语言模型&#xff08;LLM&#xff09;&#xff08;如ChatGPT和GPT-4&#xff09;的兴起&#xff0c;现在比以往任何时候都更容易构建比普通熊更智能的智能聊天机器人&#xff0c;并且可以浏览堆积如山的文档&#xff0c;为您的输入提供准确的响应。 在本系列中&#xf…

《Linux从练气到飞升》No.18 进程终止

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

sql:SQL优化知识点记录(三)

&#xff08;1&#xff09;explain之select_type和table介绍 简单的查询类型是&#xff1a;simple 外层 primary&#xff0c;括号里subquery 用到了临时表&#xff1a;derived &#xff08;2&#xff09;explain之select_type介绍 trpe反映的结果与我们sql是否优化过&#xff…

SpringCloud学习笔记(一)_快速入门

SpringCloud简介 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff09;。分布式系统的协调导致了样板模式, 使用Spr…

分布式事务(7):SpringCloud2.0整合LCN

目前LCN版本已经升级为4.0了,但是官方没有SpringCloud2.0的demo案例。 因为LCN本身是开源的,有些大神对LCN框架源码做修改,可以支持SpringCloud2.0版本。 下载地址:https://download.csdn.net/download/u013938578/88251904 1 下载LCN服务端源码 https://download.csdn.…

【OpenCV • c++】图像对比度调整 | 图像亮度调整

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;【OpenCV • c】计算机视觉&#x1f308; 若有帮助&#xff0c;还请关注➕点赞➕收藏&#xff…

C# Emgu.CV 条码检测

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Emgu.CV; using Emgu.CV.Util; using static Emgu.C…

机器人制作开源方案 | 桌面级机械臂--本体说明+驱动及控制

一、本体说明 1. 机械臂整体描述 该桌面级机械臂为模块化设计&#xff0c;包含主机模块1个、转台模块1个、二级摆动模块1个、可编程示教盒1个、2种末端执行器、高清摄像头&#xff0c;以及适配器、组装工具、备用零件等。可将模块快速组合为一个带被动关节的串联3自由度机械臂…

【业务功能篇73】web系统架构演变-单体-集群-垂直化-服务化-微服务化

1.服务架构的演 1.1 单体架构 单体架构应该是我们最先接触到的架构实现了&#xff0c;在单体架构中使用经典的三层模型&#xff0c;即表现层&#xff0c;业务逻辑层和数据访问层。 单体架构只适合在应用初期&#xff0c;且访问量比较下的情况下使用&#xff0c;优点是性价比很…

C#: Json序列化和反序列化,集合为什么多出来一些元素?

如下面的例子&#xff0c;很容易看出问题&#xff1a; 如果类本身的无参构造函数&#xff0c; 就添加了一些元素&#xff0c;那么在序列化&#xff0c;再反序列化&#xff0c;会导致元素增加。 如果要避免&#xff0c;必须添加&#xff1a; new JsonSerializerSettings() { …

拼多多anti-token分析

前言&#xff1a;拼多多charles抓包分析发现跟商品相关的请求头里都带了一个anti-token的字段且每次都不一样,那么下面的操作就从分析anti-token开始了 1.jadx反编译直接搜索 选中跟http相关的类对这个方法进行打印堆栈 结合堆栈方法调用的情况找到具体anti-token是由拦截器类f…

Spring 容器启动耗时统计

为了了解 Spring 为什么会启动那么久&#xff0c;于是看了看怎么统计一下加载 Bean 的耗时。 极简版 几行代码搞定。 import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;import java.util.HashMap; imp…

k8s挂载映射操作详解

k8s投射数据卷 Projected Volume 在 k8s 中&#xff0c;有几种特殊的 Volume&#xff0c;它们的意义不是为了存放容器里的数据&#xff0c;也不是用来进行容器和宿主机之间的数据交换。"而是为容器提供预先定义好的数据。" 从容器的角度来看&#xff0c;这些 Volume…

SQL 错误 [22007]: ERROR: invalid input syntax for type date: ““

0. 背景 PG数据库一张表有这样一个varchar类型的字段end_date,存储的值是格式化后的年月日日期如 2024-08-10 现在我需要根据当前日期与end_date的差值作为where条件过滤,我的写法 select …… from my_table_name where current_date - cast (end_date as date) >100报错…

五度易链最新“产业大数据服务解决方案”亮相,打造数据引擎,构建智慧产业

快来五度易链官网 点击网址【http://www.wdsk.net/】 看看我们都发布了哪些新功能!!! 自2015年布局产业大数据服务行业以来&#xff0c;“五度易链”作为全国产业大数据服务行业先锋企业&#xff0c;以“让数据引领决策&#xff0c;以智慧驾驭未来”为愿景&#xff0c;肩负“打…

linux中互斥锁,自旋锁,条件变量,信号量,与freeRTOS中的消息队列,信号量,互斥量,事件的区别

RTOS 对于目前主流的RTOS的任务&#xff0c;大部分都属于并发的线程。 因为MCU上的资源每个任务都是共享的&#xff0c;可以认为是单进程多线程模型。 【freertos】003-任务基础知识 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式&#xff0c;但是如…

基于Java+SpringBoot+Vue前后端分离社区医院管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…