私は、URLのリストか単一のURLのどちらかをとり、それらをレンダリングできるクラスを作ろうとしています。QApplicationを連続して実行できますか?
リストケースでは、すべてをレンダリングし、すべてのhtmlを含む辞書を使用可能にします。これは正常に動作します。
単一のケースでは、URLを受け取り、レンダリングし、htmlを属性として使用可能にして終了します。これは一度実行するとうまく動作しますが、2回以上試してみるとapp.exec_()を呼び出すとロックされます。
import sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtWebKit import QWebPage, QWebFrame
class Renderer(QWebPage):
def __init__(self):
self.app = QCoreApplication.instance()
if self.app == None:
self.app = QApplication(sys.argv)
self.app.Type(QApplication.Tty)
QWebPage.__init__(self)
self.pages = []
def start(self, urls):
#for lists
try:
self.loadFinished.disconnect()
except Exception:
pass
self.loadFinished.connect(self.listFinished)
self._urls = iter(urls)
self.fetchNext()
self.app.exec_()
def fetchNext(self):
#for lists
try:
url = next(self._urls)
except StopIteration:
return False
else:
self.mainFrame().load(QUrl(url))
return True
def listFinished(self):
#for lists
html = self.processCurrentPage()
self.pages.append(html)
if not self.fetchNext():
self.app.quit()
def processCurrentPage(self):
url = self.mainFrame().url().toString()
html = self.mainFrame().toHtml()
return html
def render(self, url):
try:
self.loadFinished.disconnect()
except Exception:
pass
self.loadFinished.connect(self.singleFinished)
self._url = url
self.mainFrame().load(QUrl(url))
self.app.exec_()
def singleFinished(self):
print "singleFinished"
html = self.processCurrentPage()
self._html = html
self.app.quit()
私がしようとしていることは可能ですか? render()を何度も呼び出せるように、このコードを修正するにはどうすればいいですか?私はちょうどリストベースのバージョンを使用する必要がありますか?
リストの大文字と小文字を同時に入力すると同じ問題が発生します。私はquit()の後にexec_()を呼び出すのが好きではないと確信していますが、これについてのドキュメントは見つかりませんでした。
あなたのクラスのコンストラクタでインスタンスを作成して、それがアプリケーションを終了していないので、最初のURLで発生レンダリング方法、それを閉じます。 – eyllanesc
@eyllanescしたがって、app.quit()を使用せずに呼び出し元に制御を戻すにはどうすればよいですか? – GreySage
コードを再現できないため、コード全体を共有することができます。 – eyllanesc