如何在用WEBKIT和GTK制作的python GUI中显示自定义(使用JAVASCRIPT)htm页面

时间:2012-07-30 09:11:34

标签: javascript webkit pygtk

我想使用gtk和webkit加载和显示html页面。以下是我到目前为止所做的事情:

load an html page, change its look (via JAVASCRIPT) and display it in a PYGTK GUI using WEBKIT

问题是我想通过取走一些div来自定义这个页面的外观。

请有人指出我正确的方向。

谢谢你 的Fabrizio

1 个答案:

答案 0 :(得分:0)

我会回答我自己的问题。

这个问题的解决方案实际上是建议here,并且可以通过使用webkit方法execute_script来实现,代码可以是(未经测试和不完整的代码):

import gtk
import webkit

def load_finished(b):
    js = 'alert("a");'
    b.execute_script(js)


w = gtk.Window()
b = webkit.WebView()
w.add(b)
b.open('http://example.com')
w.show_all()

b.connect("load-finished", load_finished)

gtk.main() 

完整的解决方案(也是我实施的解决方案)可在此处获取:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import gtk, webkit
# import jswebkit

# set of methods for the browser
def delete_event(widget, event, data=None):
    return False

def destroy(widget, data=None):
    gtk.main_quit()

def go_back(widget, data=None):
    browser.go_back()

def go_forward(widget, data=None):
    browser.go_forward()

def go_home(widget, data=None):
    browser.open("http://opencores.org/projects")

def load_www(widge, url):
    try:
        url.index("://")
    except:
        url = "http://" + url
    www_adr_bar.set_text(url)
    browser.open(url)

def load_www_bar(widge):    
    url = www_adr_bar.get_text()
    load_www(widge, url)

def update_buttons(widget, data=None):
    www_adr_bar.set_text( widget.get_main_frame().get_uri() )
    back_button.set_sensitive(browser.can_go_back())
    forward_button.set_sensitive(browser.can_go_forward())

def load_progress_amount(webview, amount):
    progress.set_fraction(amount/100.0)

    js_code = """
        var el1 = document.getElementsByClassName("top")[0]; 
        if (el1) el1.parentNode.removeChild(el1);

        var el2 = document.getElementsByClassName("banner")[0]; 
        if (el2) el2.parentNode.removeChild(el2);

        var el3 = document.getElementsByClassName("line")[0]; 
        if (el3) el3.parentNode.removeChild(el3);

        var el4 = document.getElementsByClassName("lang")[0]; 
        if (el4) el4.parentNode.removeChild(el4);

        var el5 = document.getElementsByClassName("mainmenu")[0]; 
        if (el5) el5.parentNode.removeChild(el5);

        var el6 = document.getElementsByClassName("pad_leftside")[0]; 
        if (el6) el6.parentNode.removeChild(el6);

        var el7 = document.getElementsByClassName("menu-tools")[0]; 
        if (el7) el7.parentNode.removeChild(el7);

        var el8 = document.getElementsByClassName("content")[0];
        if (el8){ var el81 = el8.nextElementSibling
                  if (el81 != null) el81.parentNode.removeChild(el81); }

        d1 = document.getElementsByClassName('main')[0];
        if(d1){d1.style.width="100%";
               d1.style.margin="0pt";}

        d2 = document.getElementsByTagName('body')[0];
        if(d2) d2.style.backgroundColor= "#FFF";

        d3 = document.getElementsByClassName('content')[0];
        if (d3) {d3.style.width="100%";
                 d3.style.paddingBottom ="20pt";}

        function getsupportedprop(proparray){
            var root=document.documentElement
            for (var i=0; i<proparray.length; i++){
                if (typeof root.style[proparray[i]]=="string"){
                    return proparray[i] 
        }}}

        // change some css3 proprieties 
        var boxshadowprop=getsupportedprop(['boxShadow', 'MozBoxShadow', 'WebkitBoxShadow'])
        d4 = document.getElementsByClassName('main')[0];
        if(d4) d4.style[boxshadowprop]='0px 0px 0px #FFF';
    """
    try:
        pass
        webview.execute_script(js_code)
        #ctx = get_js_context(webview)
        #ctx.EvaluateScript(js_code)
    except:
        pass

def load_started(webview, frame):
    progress.set_visible(True)

#def get_js_context(webview):
#    frame = webview.get_main_frame()
#    return jswebkit.JSContext(frame.get_global_context())

def load_finished(webview, frame):
    progress.set_visible(False)

def download(webview, download):

    import threading, urllib

    saveas = gtk.FileChooserDialog(title=None,
             action=gtk.FILE_CHOOSER_ACTION_SAVE,
             buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                      gtk.STOCK_SAVE, gtk.RESPONSE_OK))

    # get url under the mouse and propose it as file name
    downloadfrom = download.get_network_request().get_uri()
    saveas.set_current_name(downloadfrom.split('/')[-1]) # better stripping method is needed

    saveas.set_default_response(gtk.RESPONSE_OK)
    resp = saveas.run()

    if resp == gtk.RESPONSE_OK:
        downloadto = saveas.get_filename()
    saveas.destroy()

    if resp == gtk.RESPONSE_OK:
        # TODO this needs to go in a different thread
        # also, this will not work with the link: http://opencores.org/download,audio
        print 'Downloading: ', downloadfrom, 'and saving it in:', downloadto

        #urllib.urlretrieve(downloadfrom, downloadto)

        # multithreading version
        mythread = threading.Thread(target = urllib.urlretrieve,
                                   args = (downloadfrom,downloadto))
        mythread.start()


if __name__ == '__main__':
    win = gtk.Window(gtk.WINDOW_TOPLEVEL)
    win.set_size_request(920, 600)
    win.connect("delete_event", delete_event)
    win.connect("destroy", destroy)
    win.set_resizable(True)

    scroller = gtk.ScrolledWindow()
    browser = webkit.WebView()

    settings = browser.get_settings()
    settings.set_property('enable-default-context-menu', True)


    browser.connect("load-progress-changed", load_progress_amount)
    browser.connect("load-started", load_started)
    browser.connect("load-finished", load_finished)
    browser.connect("load_committed", update_buttons)
    #browser.connect("download-requested", download_link)
    browser.connect("download_requested", download)

    prj_button = gtk.Button('OpenCores')
    login_button = gtk.Button('Login')
    account_button = gtk.Button('My Account')
    faq_button = gtk.Button('FAQ')

    prj_button.connect("clicked", load_www,'http://opencores.org/projects')
    login_button.connect("clicked", load_www,'http://opencores.org/login')
    account_button.connect("clicked", load_www,'http://opencores.org/acc')
    faq_button.connect("clicked", load_www,'http://opencores.org/faq')

    www_adr_bar = gtk.Entry()
    www_adr_bar.connect("activate", load_www_bar)
    hlp_hbox = gtk.HBox()
    hlp_vbox = gtk.VBox()
    progress = gtk.ProgressBar()
    back_button = gtk.ToolButton(gtk.STOCK_GO_BACK)
    back_button.connect("clicked", go_back)
    forward_button = gtk.ToolButton(gtk.STOCK_GO_FORWARD)
    forward_button.connect("clicked", go_forward)
    #home_button = gtk.ToolButton(gtk.STOCK_HOME)
    #home_button.connect("clicked", go_home)

    # put stuff together
    hlp_hbox.pack_start(back_button,False, False,5)
    hlp_hbox.pack_start(forward_button,False, False)
    #hlp_hbox.pack_start(home_button,False, False)

    hlp_hbox.pack_start(prj_button,False, False,4)
    hlp_hbox.pack_start(login_button,False, False,4)
    hlp_hbox.pack_start(account_button,False, False,4)
    hlp_hbox.pack_start(faq_button,False, False,4)

    hlp_hbox.pack_start(www_adr_bar,True, True,4)

    hlp_vbox.pack_start(hlp_hbox,False, False,2)
    hlp_vbox.pack_start(scroller,True, True,4)
    hlp_vbox.pack_start(progress,False, False)
    scroller.add(browser)

    default_www = 'http://opencores.org/projects'
    www_adr_bar.set_text(default_www)

    # LOAD PAGE
    browser.open(default_www)
    back_button.set_sensitive(False)
    forward_button.set_sensitive(False)

    win.add(hlp_vbox)
    win.show_all()
    gtk.main()

这将产生以下结果:

enter image description here

如果没有命令webview.execute_script(js_code),效果将是:

enter image description here