1

我在 PyQt4 中编写了抓取网站及其内部框架的代码。

import sys, signal
from PyQt4 import QtGui, QtCore, QtWebKit

class Sp():
  def save(self, ok, frame=None):
    if frame is None:
      print ('main-frame')
      frame = self.webView.page().mainFrame()
    else:
      print('child-frame')
    print('URL: %s' % frame.baseUrl().toString())
    print('METADATA: %s' % frame.metaData())
    print('TAG: %s' % frame.documentElement().tagName())
    print('HTML: ' + frame.toHtml())
    print()

  def handleFrameCreated(self, frame):
    frame.loadFinished.connect(lambda: self.save(True, frame=frame))

  def main(self):
    self.webView = QtWebKit.QWebView()
    self.webView.page().frameCreated.connect(self.handleFrameCreated)
    self.webView.page().mainFrame().loadFinished.connect(self.save)
    self.webView.load(QtCore.QUrl("http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_iframe_scrolling"))

signal.signal(signal.SIGINT, signal.SIG_DFL)
print('Press Crtl+C to quit\n')
app = QtGui.QApplication(sys.argv)
s = Sp()
s.main()
sys.exit(app.exec_())  

此代码取决于创建 QApplication 的实例并相应地退出它。
这样做的问题是必须在主线程中创建和退出 QApplication。
我无权访问我正在开发的项目中的主线程。
是否有可能以某种方式避免“QApplication 未在 main() 线程中创建”错误?
也许通过重写代码使其在没有 QApplication 的情况下工作,或者以某种方式使 QApplication 在没有主线程的情况下工作?
编辑:如果主线程不干预其代码的执行流程,我可以编辑主线程,例如app = QtGui.QApplication([])不会停止流程,但挂起直到另一个线程中的某些代码完成的函数将被视为不适用。

4

0 回答 0