使用wxPython WebView瀏覽器版本問題


使用CodeMirror和wxPyhton的WebView創建嵌入客戶端的本地代碼編輯工具。

版本為wxPython 3.0,CodeMirror 支持的瀏覽器IE8或以上。

wxPython提供了HtmlWindow,不過HtmlWindow不是一個完全的渲染引擎,沒有辦法處理css和javascript。這里是用WebView來進行渲染,在Windows上使用Trident Engine,就是IE的內核。使用時調用的是本地安裝的IE,通過當前的WebBrowser控件提供,默認是模擬IE7,通過注冊表可以進行修改,看這里

原先在默認的IE7中Tab鍵有問題,我以為是Tab鍵發生沖突,后面經過折騰發現了瀏覽器版本過低,js的解釋有問題,終於問題得以解決。

下面是在windows下python修改默認IE版本為IE11,使用_winreg進行注冊表的修改,修改完成后,刪除修改過的鍵值

#coding=utf-8
import _winreg, sys 

#更改系統默認編碼
reload(sys)   
sys.setdefaultencoding('utf8')

# 這里需要打開所有權限
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 
    r"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", 0, _winreg.KEY_ALL_ACCESS)
try:
    # 設置注冊表python.exe 值為 11000(IE11)
    _winreg.SetValueEx(key, 'python.exe', 0, _winreg.REG_DWORD, 0x00002af8)
except:
    # 設置出現錯誤
    print('error in set value!')

# 用完取消注冊表設置
_winreg.DeleteValue(key, 'python.exe')
# 關閉打開的注冊表
_winreg.CloseKey(key)

完整的一個sample放入wxPython中, 其中a.html是在本地導入的需要渲染的html文件:

import wx, wx.html2, os, _winreg

class MyBrowser(wx.Frame): 
    def __init__(self, *args, **kwds): 
        wx.Frame.__init__(self, None, -1, "My Frame", size=(300, 300))
        # 這里需要打開所有權限
        self.key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 
              r"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", 0, _winreg.KEY_ALL_ACCESS)
        try:
            # 設置注冊表python.exe 值為 11000(IE11)
            _winreg.SetValueEx(self.key, 'python.exe', 0, _winreg.REG_DWORD, 0x00002af8)
        except:
            # 設置出現錯誤
            print('error in set value!')
        self.browser = wx.html2.WebView.New(self, style=0)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        
                         
    def OnClose(self, evt):
        print('close')
        # 用完取消注冊表設置
        _winreg.DeleteValue(self.key, 'python.exe')
        # 關閉打開的注冊表
        _winreg.CloseKey(self.key)
        evt.Skip()

if __name__ == '__main__': 
  app = wx.App() 
  frame = MyBrowser()
  frame.browser.LoadURL(os.path.realpath("a.html")) 
  frame.Show() 
  app.MainLoop()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM