Играем с PyQt4 и WebKit

Discussion in 'Python' started by ^NSA^, 1 Feb 2013.

  1. ^NSA^

    ^NSA^ Elder - Старейшина

    Joined:
    3 Jul 2012
    Messages:
    64
    Likes Received:
    29
    Reputations:
    32
    Играем с PyQt4 и WebKit

    Первый делом софт среда разработки IDE Aptana Studio.
    Ставим затем Python на конец качай от сюда PyQt4.

    Как настроить сам Python можно почитать тут

    приступаем создаем новый проект Qweb.
    добавляем нужные нам либы.

    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    from PyQt4.QtWebKit import *

    Пора написать первую программу код еще прост пример код 1.
    Сперва создаем приложение для запуска.
    потом создаем наше веб приложнеие.
    устанавливаем название у окна "Hello Webkit"
    потом грузим в него веб контент, показываем его.

    Code:
    '''
    Created on Jan 31, 2013
    
    @author: ^NSA^
    '''
    import sys  
    
    from PyQt4.QtGui import *  
    from PyQt4.QtCore import *  
    from PyQt4.QtWebKit import * 
    
    #part one welcome
    app = QApplication(sys.argv);
    web = QWebView()
    web.setWindowTitle("Hello Webkit")
    web.load(QUrl("http://antichat.ru"))
    web.show()
    sys.exit(app.exec_())
    
    
    
    Переходим на пример кода 2.
    Тут видем новые строки кода.
    Создали фрайм от веб-приложения через него получаем доступ обьектам веб-приложения.
    frame =web.page().mainFrame()
    Обрабочик событий Qt это сигналы и слоты.
    web.loadFinished.connect(loaded)
    когда загрузка закончена вызывается слот а слот простой метод или функция.
    В нашем случае def loaded(): это и выполняем Javascript код frame.evaluateJavaScript("alert('Welcome Home')")

    Code:
    '''
    Created on Jan 31, 2013
    
    @author: ^NSA^
    '''
    import sys  
    
    from PyQt4.QtGui import *  
    from PyQt4.QtCore import *  
    from PyQt4.QtWebKit import * 
    
    #slot
    def loaded():
        print("loaded")
        frame.evaluateJavaScript("alert('Welcome Home')")
        
        
    #part two signal and slot and frame
    app = QApplication(sys.argv);
    web = QWebView()
    frame =web.page().mainFrame()
    web.setWindowTitle("Hello Webkit")
    #new
    web.loadFinished.connect(loaded)
    web.load(QUrl("http://antichat.ru"))
    
    web.show()
    sys.exit(app.exec_())
    

    [​IMG]

    Далее у нас пример кода номер 3.
    тут Создаем свой Виджет наследую от QWidget, про виджеты говорить не буду сами прочитаете.
    Когда создается виджет вызывается self.setupInspector() для создание Инспектора удобная вещь для отладки.
    Наш слот сменил название changeHead.
    Если нашем окне нажать F2 то Инспектор закроется еще раз нажать снова будет виден.

    Code:
    '''
    Created on Jan 31, 2013
    
    @author: hide
    '''
    
    '''
    Created on Jan 31, 2013
    
    @author: ^NSA^
    '''
    import sys  
    
    from PyQt4.QtGui import *  
    from PyQt4.QtCore import *  
    from PyQt4.QtWebKit import * 
    
    class Window(QWidget):
        def __init__(self):
            super(Window, self).__init__()
            self.view = QWebView(self)
            #create Inspector
            self.setupInspector()
            
            
            self.frame =self.view.page().mainFrame()
            
    
            self.splitter = QSplitter(self)
            self.splitter.setOrientation(Qt.Vertical)
            
            self.view.loadFinished.connect(self.changeHead)
            # layout see more doc qt
            layout = QVBoxLayout(self)
            layout.setMargin(0)
            layout.addWidget(self.splitter)
    
            self.splitter.addWidget(self.view)
            self.splitter.addWidget(self.webInspector)
            
        def changeHead(self):
            self.frame.evaluateJavaScript("console.log('Hello Home')")
            
            
        #for debug need    
        def setupInspector(self):
            page = self.view.page()
            page.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
            self.webInspector = QWebInspector(self)
            self.webInspector.setPage(page)
    
            shortcut = QShortcut(self)
            #can change key Key_F12
            shortcut.setKey(Qt.Key_F2)
            shortcut.activated.connect(self.toggleInspector)
            # can see
            self.webInspector.setVisible(True)
            #hide or show
        def toggleInspector(self):
            self.webInspector.setVisible(not self.webInspector.isVisible())
    
    
       
        
        
    #part 3  go to Class and method
    app = QApplication(sys.argv);
    web = Window()
    
    web.view.load(QUrl("http://antichat.ru"))
    web.show()
    sys.exit(app.exec_())
    
    [​IMG]

    Последний пример кода 4 показывает как можно выбирать Document Object Model.
    Выбираем первый элемент self.documentElement = self.frame.findFirstElement("head")
    потом добавляем в него self.documentElement.appendInside("<script src='http://code.jquery.com/jquery-1.9.0.min.js'>").
    Также можем удалять элементы self.el.removeAllChildren(), добавлять классы из CSS self.el.addClass("qgreen") и многое другое делать.

    Code:
    '''
    Created on Jan 31, 2013
    
    @author: hide
    '''
    
    '''
    Created on Jan 31, 2013
    
    @author: ^NSA^
    '''
    import sys  
    
    from PyQt4.QtGui import *  
    from PyQt4.QtCore import *  
    from PyQt4.QtWebKit import * 
    
    class Window(QWidget):
        def __init__(self):
            super(Window, self).__init__()
            self.view = QWebView(self)
            #create Inspector
            self.setupInspector()
            
            
            self.frame =self.view.page().mainFrame()
            
    
            self.splitter = QSplitter(self)
            self.splitter.setOrientation(Qt.Vertical)
            
            self.view.loadFinished.connect(self.changeHead)
            # layout see more doc qt
            layout = QVBoxLayout(self)
            layout.setMargin(0)
            layout.addWidget(self.splitter)
    
            self.splitter.addWidget(self.view)
            self.splitter.addWidget(self.webInspector)
            
        def changeHead(self):
            
            js = '''<script> 
            function qw(){
            console.log("test");
            alert("Test");
           
            
                $(".qgreen).click(function() {
                     
                       
              
            });
            
           
           }
            '''
            self.frame.evaluateJavaScript("console.log('Hello Home')")
            self.documentElement = self.frame.findFirstElement("head")
            self.el= self.frame.findFirstElement("div")
            self.el.addClass("qgreen")
            
            self.el.removeAllChildren()
            
            self.documentElement.appendInside("<script src='http://code.jquery.com/jquery-1.9.0.min.js'>")
            self.documentElement.appendInside(js)
            self.frame.evaluateJavaScript("qw();");
            
            
            
        #for debug need    
        def setupInspector(self):
            page = self.view.page()
            page.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
            self.webInspector = QWebInspector(self)
            self.webInspector.setPage(page)
    
            shortcut = QShortcut(self)
            #can change key Key_F12
            shortcut.setKey(Qt.Key_F2)
            shortcut.activated.connect(self.toggleInspector)
            # can see
            self.webInspector.setVisible(True)
            #hide or show
        def toggleInspector(self):
            self.webInspector.setVisible(not self.webInspector.isVisible())
    
    
       
        
        
    #part 3  go to Class and method
    app = QApplication(sys.argv);
    web = Window()
    
    web.view.load(QUrl("http://antichat.ru"))
    web.show()
    sys.exit(app.exec_())
    
    [​IMG]

    Автор ^NSA^ 2013г продолжение следует.
     
    #1 ^NSA^, 1 Feb 2013
    Last edited: 1 Feb 2013
  2. m00c0w

    m00c0w Banned

    Joined:
    25 Dec 2011
    Messages:
    104
    Likes Received:
    14
    Reputations:
    5
    мне по душе wingide для кодинга на python.

    по PyQt можно вот такую книжечку полистать для начала.

    http://books.google.lu/books?id=igcZ-fnxTwEC&pg=PA361&hl=de&source=gbs_toc_r&cad=3#v=onepage&q&f=false

    PS скоро будем обучать как нажать кнопку мыши: "Пальчик помыть, аккуратно коснуться и..." :confused:
     
    #2 m00c0w, 1 Feb 2013
    Last edited: 1 Feb 2013
  3. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Книжка как по мне не очень читал, но тема сисек там не раскрыта.
    Для WebKit под питон юзаю Spynner удобная обертка.
     
  4. m00c0w

    m00c0w Banned

    Joined:
    25 Dec 2011
    Messages:
    104
    Likes Received:
    14
    Reputations:
    5
    тема сисек раскрыта в официальной документации, как всегда. Можно еще просто по Qt купить\скачать- там раскроются новые подробности гуй-строения на qt =) Все хотят готовенького, но если решили сами что то делать, нужно "пуд соли съесть", чтобы результат был.