PyQt Webkit y formularios html: Obteniendo resultados y cerrando ventana

Estoy intentando obtener una ventana de PyQt webkit Python sin bordes para mostrar un único formulario html de sitio web. Al hacer clic en enviar, los valores del formulario deben guardarse en un diccionario y la ventana cerrada.

Hasta ahora (con la ayuda de un SO ) tengo la ventana sin bordes y puedo recuperar la entrada. Sin embargo, faltan dos cosas:

  1. Cerrando la ventana después de pulsar enviar.
  2. Obtención de la entrada en los elements del diccionario (tenga en cuenta que las claves de los elements corresponden a los nombres de los formularios html).

(potencialmente lo contrario sería mejor, pero 1 parece más difícil)

Mi código hasta ahora es:

 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 = "
\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 = """ Like it? Yes No
""" def main(): app = QApplication(sys.argv) window = Window(html) window.show() app.exec_() if __name__ == "__main__": main()

Una respuesta perfecta no solo mostraría cómo (a) guardar la entrada y (b) cerrar la ventana , sino que (c) también quitar el borde gris pequeño restante alrededor de la página html .

Actualización : yo uso Python 2.

Para obtener los datos del formulario en un dict , es mejor usar unquote_plus de la biblioteca estándar de python ya que (a diferencia de QUrl ) puede manejar signos más, así como la encoding de porcentaje.

Para cerrar la ventana, puede emitir una señal de formSubmitted desde la página web y conectarla a un controlador en la ventana principal. Este controlador podría luego llamar a close() en la ventana principal, hacer todo el procesamiento de los datos del formulario y, finalmente, quit() la aplicación.

Para eliminar el borde alrededor de la página, establezca los contentsMargins del diseño principal en cero.

Aquí está la versión revisada de su script que implementa las ideas anteriores:

 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 = """ 
Like it? Yes No
""" def main(): app = QApplication(sys.argv) window = Window(html) window.show() app.exec_() if __name__ == "__main__": main()