Ошибка вызова слота с PySide - PullRequest
       7

Ошибка вызова слота с PySide

0 голосов
/ 07 сентября 2011

Я пытаюсь разобраться с зависимым от JavaScript сайтом . Это довольно простой сайт с простым списком объектов (фактически, названия городов), которые я не хочу копировать и вставлять в Excel. Список управляется javascript, поэтому я решил, что мне нужно использовать что-то вроде Qt4 для эмуляции браузера, и я пробовал PySide.

Я начал с очень простого кода (который я адаптировал с здесь ):

#!/usr/bin/env python

import sys
import signal 
import argparse

from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtWebKit import QWebPage


class Crawler( QWebPage ):
def __init__(self, url, file):
    QWebPage.__init__( self )
    self._url = url
    self._file = file

def crawl( self ):
    signal.signal( signal.SIGINT, signal.SIG_DFL )
    self.connect( self, SIGNAL( 'loadFinished(bool)' ), self._finished_loading )
    self.mainFrame().load( QUrl( self._url ) )

def _finished_loading( self, result ):
    file = open( self._file, 'w' )
    file.write( self.mainFrame().toHtml() )
    file.close()
    sys.exit( 0 )

def main():
    app = QApplication( sys.argv )
    args = get_args()
    crawler = Crawler( args.url, args.file )
    crawler.crawl()
    sys.exit( app.exec_() )

def get_args():
"""
Command argument parser

Returns structure:
    args.url
    args.file
"""

parser = argparse.ArgumentParser(description='Basic scraper')
parser.add_argument( '-u', '--url', dest='url', help='URL to fetch data from', default='http://www.google.com')
parser.add_argument('-f','--file', dest='file', help='Local file path to save data to', default='data.txt')

args = parser.parse_args()
return args


if __name__ == '__main__':
    main()

Проблема в том, что я не очень хорошо знаю PySide / Qt4. Я получаю эту ошибку:

Error calling slot "_finished_loading" 

Я даже не уверен, что это значит. Это то, что я могу обойти, не занимаясь долгим и трудным процессом выяснения Qt4 и PySide? Это простое исправление?

Спасибо за все комментарии.

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Попробуйте заменить sys.exit( 0 ) в _finished_loading на QApplication.instance().exit().

0 голосов
/ 22 декабря 2014

Вы не объявили _finished_loading как слот.Для этого вам нужно использовать декоратор @Slot (), например

@Slot(str)
def _finished_loading(self, result):
    print(result)

@Slot(int, int)
def add(self, a, b):
    print(a+b)

и так далееАргументы для декоратора - это разделенный запятыми список типов данных Python ожидаемых аргументов функций.

...