0

我在windows中使用wxpython创建一个应用程序,我想发布一些数据来创建一个html视图,pubsub数据可以在cmd窗口中打印,但是当我在webview中设置页面时,它不起作用,我可以使用webview吗做出这个效果?ps:如果webview可以做到这一点,当点击一个链接时,它是否可以弹出一个新的框架来解析这个链接的一些数据?

好吧,我没有清楚地描述我的问题,也许我可以通过代码清楚地描述它:

在 wxpython2.8 中,我的代码:

import time
import wx
import re
from threading import Thread
from wx.lib.pubsub import Publisher

import urllib2  
from win32gui import *
import win32gui
from wx.lib.wordwrap import wordwrap
import wx.html2 as webview
import lxml.html
import lxml.html.soupparser as soupparser


class ListenerThread(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.start() 

    def findtitle(self):
        ........
        ........

    def find_window(self):
        title = self.findtitle()
        dlg=win32gui.FindWindow(None,title)
        return dlg

    def run(self):
        tempWindowName=win32gui.GetWindowText (self.find_window())
        while True:
            ........
            ........
            Publisher().sendMessage("update", info)
        time.sleep(0.1)

class InfoFrame(wx.Frame):
    def __init__(self):
       wx.Frame.__init__(self, None, title="title",size=(430, 700))
       panel = InfoPanel(self)
       style= self.GetWindowStyle()
       self.SetWindowStyle(style|wx.STAY_ON_TOP)

class InfoPanel(wx.Panel):
    def __init__(self, parent):
        .......

        self.browser= wx.html.HtmlWindow(self)
        Publisher().subscribe(self.updateDisplay)


        ......

    def updateDisplay(self, msg):
        t = msg.data
        self.browser.SetPage("%s"%t)


class MyApp(wx.App):
    def OnInit(self):
        self.infoFrame=InfoFrame()       
        self.SetTopWindow(self.infoFrame)
        self.infoFrame.Show(True)    
        return True

    def OnExit(self):
        wx.Exit()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = MyApp(False)
    app.MainLoop()

信息的结构像

<a href=....>text1</a><br><a href=......>text2</a><br>.....

它是通过lxml从其他网站解析的,这段代码可以工作,但我认为这个视图很难看,我想添加一些css样式,我想也许我可以打开一个新框架来显示一些内容,当我通过链接解析时点击链接。

所以,我在谷歌搜索,然后发现也许wxpython2.9中的webview可以做到这一点,然后,我改变了我的代码:

import time
import wx
import re
from threading import Thread
from wx.lib.pubsub import setupv1   
from wx.lib.pubsub import pub

import urllib2  
from win32gui import *
import win32gui
from wx.lib.wordwrap import wordwrap
import wx.html2 as webview
import lxml.html
import lxml.html.soupparser as soupparser

publisher = pub.Publisher()




class ListenerThread(Thread):
    def __init__(self):
        """Init Worker Thread Class."""
        Thread.__init__(self)
        self.start() 

    def findtitle(self):
        ........
        ........

    def find_window(self):
        title = self.findtitle()
        dlg=win32gui.FindWindow(None,title)
        return dlg

    def run(self):
        tempWindowName=win32gui.GetWindowText (self.find_window())
        while True:
            ........
            ........
            Publisher().sendMessage("update", info)
        time.sleep(0.1)

class InfoPanel(wx.Panel):
    def __init__(self, parent):
        .......

        self.browser= webview.WebView.New(self)
        publisher.subscribe(self.updateDisplay)


        ......

    def updateDisplay(self, msg):
        t = msg.data
        page = "<html><body>"+"%s"%t+"</body></html>"
        self.browser.SetPage("%s"%t)


class MyApp(wx.App):
    def OnInit(self):
        self.infoFrame=InfoFrame()       
        self.SetTopWindow(self.infoFrame)
        self.infoFrame.Show(True)    
        return True

    def OnExit(self):
        wx.Exit()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = MyApp(False)
    app.MainLoop()

但它显示错误:

NotimpementedError:没有匹配的函数 fo overoaded 'WebView_SetPage'

感谢您的时间,任何建议都非常感谢。

4

1 回答 1

1

根据 docsSetPage函数需要两个参数。

来自html2.py

SetPage(self, String html, String baseUrl)
SetPage(self, InputStream html, String baseUrl)

来自http://docs.wxwidgets.org/trunk/classwx_web_view.html

html- 包含要显示的 HTML 数据的字符串。
baseUrl- 分配给 HTML 数据的 URL,例如用于解析相对路径。

只是您可以将第二个留空。

import wx
import wx.html2


class AppFrame(wx.Frame):
    def __init__(self, parent):
        super(AppFrame, self).__init__(parent)

        self.html_view = wx.html2.WebView.New(self)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.html_view, 1, wx.EXPAND)
        self.SetSizer(sizer)

if __name__ == '__main__':
    app = wx.App()

    frame = AppFrame(None)
    frame.html_view.SetPage("<html><body>Hello World</body></html>", "")
    frame.Show()
    app.MainLoop()
于 2013-04-29T13:12:27.183 回答