如何使用Internet Explorer控件在Python中创建HTML对话框窗口?

时间:2016-03-22 19:53:20

标签: python html internet-explorer com activex

我需要创建一个显示HTML页面的对话框。应用程序是用Python编写的,对话框必须包含Internet Explorer控件。 Python是否支持与COM / ActiveX的集成,是否有任何这种集成的工作示例?

如果可能,请提供答案,不要链接到第三方网站。 请不要提供.NET / C ++ / Chrome或任何其他组合。 Python + IE是我的要求,无法更改。

2 个答案:

答案 0 :(得分:3)

您可以使用wxWidgets WebView组件(通过wxPython)在Python GUI应用程序中嵌入Internet Explorer窗口。与...不同Qt包括跨所有平台的标准化浏览器组件,wxWidgets默认使用主机平台上的本机浏览器。您也可以通过手动设置后端来强制IE(忽略用户的默认浏览器)。

在文档中显示WEBVIEW_BACKEND_IE,但实际值可通过wx.html2.WebViewBackendIE获得。以下是一个完整的工作示例,改编自here

import wx 
import wx.html2 

class MyBrowser(wx.Frame): 
    def __init__(self, *args, **kwds): 
        wx.Frame.__init__(self, *args, **kwds) 
        sizer = wx.BoxSizer(wx.VERTICAL) 
        self.browser = wx.html2.WebView.New(self, backend=wx.html2.WebViewBackendIE) 
        sizer.Add(self.browser, 1, wx.EXPAND, 10) 
        self.SetSizer(sizer) 
        self.SetSize((700, 700)) 

if __name__ == '__main__': 
    app = wx.App() 
    dialog = MyBrowser(None, -1) 
    dialog.browser.LoadURL("https://www.google.com") 
    dialog.Show() 
    app.MainLoop() 

当然,这只适用于Windows。有关wxWidgets中WebView的更多信息,请参阅documentation

如果您已经为您的应用程序使用(Py)Qt,Qt还支持使用QAxWidget类在Windows中嵌入ActiveX对象。 Qt documentation中有一个Web浏览器示例。以下是最小PyQt4 example

browser = QAxContainer.QAxWidget() 
browser.setControl("<ActiveX ID>") # e.g. "{8856F961-340A-11D0-A96B-00C04FD705A2}"
browser.dynamicCall('Navigate(const QString&)', QtCore.QString("google.com"))

答案 1 :(得分:3)

你可以在没有太多困难的情况下使用COM。这是一个简单的例子:

import win32com.client
ie = win32com.client.Dispatch("InternetExplorer.Application")

ie.Visible = 1
ie.Navigate('www.google.com')

您可能只想下载此项目并阅读IEC.py以获取有用的所有com命令(我知道您不是在寻找链接,但在这种情况下,已有500行代码可以为您节省大量时间,按钮点击,获取文档文本,复选框,提交表单等。)http://www.mayukhbose.com/python/IEC/

我认为这将解决您的问题。如果您已经知道所有的IE com命令(或者只是在IPython中点击“tab”来获取列表In [1]: ie. <tab>),那么上面的简单示例就足够了。

另外请注意,使用COM对象时,只需运行此对象即可大大加快它们的速度:

from win32com.client import makepy
makepy.main()

然后滚动弹出窗口找到你的应用程序(IE Microsoft Internet Controls) - 所有已注册的COM接口应该在那里,这将自动生成内部方法,而不是每次调用库时都这样做。