4

ボーダレスのPythonPyQtWebkitウィンドウを取得して、単一のWebサイトのhtmlフォームを表示しようとしています。[送信]をクリックすると、フォームの値が辞書に保存され、ウィンドウが閉じます。

これまでのところ(SOの助けを借りて)私はフチなしウィンドウを持っており、入力をフェッチすることができます。ただし、次の2つが欠けています。

  1. 送信を押した後、ウィンドウを閉じます。
  2. 辞書の入力を取得します(のキーはhtmlフォーム名 elementsに対応していることに注意してください)。elements

(潜在的には逆の方が良いでしょうが、1はもっと難しいようです)

これまでの私のコードは次のとおりです。

import sys

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

elements = {"like":"", "text": ""}

class MyWebPage(QWebPage):
    def acceptNavigationRequest(self, frame, req, nav_type):
        if nav_type == QWebPage.NavigationTypeFormSubmitted:
            text = "<br/>\n".join(["%s: %s" % pair for pair in req.url().queryItems()])
            print(text)
            return True
        else:
            return super(MyWebPage, self).acceptNavigationRequest(frame, req, nav_type)


class Window(QWidget):
    def __init__(self, html):
        super(Window, self).__init__()
        self.setWindowFlags(Qt.FramelessWindowHint)
        view = QWebView(self)
        layout = QVBoxLayout(self)
        layout.addWidget(view)
        view.setPage(MyWebPage())
        view.setHtml(html)


# setup the html form
html = """
<form action="" method="get">
Like it?
<input type="radio" name="like" value="yes"/> Yes
<input type="radio" name="like" value="no" /> No
<br/><input type="text" name="text" value="Hello" />
<input type="submit" name="submit" value="Send"/>
</form>
"""

def main():
    app = QApplication(sys.argv)

    window = Window(html)
    window.show()
    app.exec_()

if __name__ == "__main__":
    main()

完璧な答えは、(a)入力を保存し、 (b)ウィンドウを閉じる方法を示すだけでなく、(c)htmlページの周りに残っている小さな灰色の境界線を削除する方法も示します

更新:Python2を使用しています。

4

1 に答える 1

3

フォームデータをに取得するには、Python標準ライブラリからdict使用するのが最適です。これはunquote_plus(とは異なりQUrl)プラス記号とパーセントエンコードを処理できるためです。

ウィンドウを閉じるにはformSubmitted、Webページからシグナルを送信し、それをメインウィンドウのハンドラーに接続します。close()次に、このハンドラーはメインウィンドウを呼び出し、フォームデータのすべての処理を実行し、最後quit()にアプリケーションを実行します。

ページの周囲の境界線を削除するにcontentsMarginsは、メインレイアウトのをゼロに設定します。

上記のアイデアを実装したスクリプトの改訂版は次のとおりです。

import sys
from urllib import unquote_plus

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

class MyWebPage(QWebPage):
    formSubmitted = pyqtSignal(QUrl)

    def acceptNavigationRequest(self, frame, req, nav_type):
        if nav_type == QWebPage.NavigationTypeFormSubmitted:
            self.formSubmitted.emit(req.url())
        return super(MyWebPage, self).acceptNavigationRequest(frame, req, nav_type)

class Window(QWidget):
    def __init__(self, html):
        super(Window, self).__init__()
        self.setWindowFlags(Qt.FramelessWindowHint)
        view = QWebView(self)
        layout = QVBoxLayout(self)
        layout.addWidget(view)
        layout.setContentsMargins(0, 0, 0, 0)
        view.setPage(MyWebPage())
        view.setHtml(html)
        view.page().formSubmitted.connect(self.handleFormSubmitted)

    def handleFormSubmitted(self, url):
        self.close()
        elements = {}
        for key, value in url.encodedQueryItems():
            key = unquote_plus(bytes(key)).decode('utf8')
            value = unquote_plus(bytes(value)).decode('utf8')
            elements[key] = value
        # do stuff with elements...
        for item in elements.iteritems():
            print '"%s" = "%s"' % item
        qApp.quit()

# setup the html form
html = """
<form action="" method="get">
Like it?
<input type="radio" name="like" value="yes"/> Yes
<input type="radio" name="like" value="no" /> No
<br/><input type="text" name="text" value="" />
<input type="submit" name="submit" value="Send"/>
</form>
"""

def main():
    app = QApplication(sys.argv)

    window = Window(html)
    window.show()
    app.exec_()

if __name__ == "__main__":
    main()
于 2012-09-03T00:15:30.423 に答える