PyQt5 QUrl在QUrl.setUrl之后为空

2024-09-28 20:53:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我的python脚本有问题。我想做一个简单的应用程序,让一个人在网站上自动登录。我认为这可以通过QUrl和QUrl查询来实现。只是html中的表单确实如此。现在我的问题是:当我试图用 print(login_url.toString(QUrl())),它只打印一个空行

伊瑟夫比

# -*- coding: utf-8 -*-
from PyQt5.QtCore import QUrl, QUrlQuery
from PyQt5.QtWidgets import QMessageBox
from PyQt5 import QtWidgets

import os
import Webview
import sys


def handle_url_changed():
    if webView.url() == QUrl("https://the-server.de/iserv/login"):
        login_url = QUrl
        login_url.setUrl(QUrl(), "https://the-server.de/iserv/login_check")
        # os.system("notify-send " + login_url.toString(QUrl()))

        login_query = QUrlQuery
        login_query.addQueryItem(QUrlQuery(), "Class", "login-form")
        login_query.addQueryItem(QUrlQuery(), "Method", "post")
        login_query.addQueryItem(QUrlQuery(), "_username", "...")
        login_query.addQueryItem(QUrlQuery(), "_password", "...")
        login_query.addQueryItem(QUrlQuery(), "_remember_me", "0")

        login_url.setQuery(QUrl(), login_query())
        webView.load(login_url())
        print(login_url.toString(QUrl()))


app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Webview.Ui_MainWindow()
ui.setupUi(MainWindow)
webView = ui.webView
webView.urlChanged.connect(lambda: handle_url_changed())
MainWindow.show()
sys.exit(app.exec_())

Webview.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Webview.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import QtWebEngineWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(900, 700)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(500, 625))
        MainWindow.setFocusPolicy(QtCore.Qt.NoFocus)
        MainWindow.setUnifiedTitleAndToolBarOnMac(True)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.webView = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
        self.webView.setUrl(QtCore.QUrl("https://the-server.de/"))
        self.webView.setObjectName("webView")
        self.gridLayout.addWidget(self.webView, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "IServ"))


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())


Tags: fromimportselfurluisysloginquery
1条回答
网友
1楼 · 发布于 2024-09-28 20:53:02

主要错误是您没有创建QUrl和QUrlQuery对象(或者说您正在立即创建和删除它们)

此外,创建类比处理全局变量更好,以避免出现无提示错误

因此我建议您查看OOP说明。

考虑到上述情况,解决方案是:

# -*- coding: utf-8 -*-
import os
import sys

from PyQt5.QtCore import QUrl, QUrlQuery
from PyQt5.QtWidgets import QMessageBox
from PyQt5 import QtWidgets


import Webview


class MainWindow(QtWidgets.QMainWindow, Webview.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.webView.urlChanged.connect(self.handle_url_changed)

    def handle_url_changed(self, url):
        if url == QUrl("https://the-server.de/iserv/login"):
            login_url = QUrl("https://the-server.de/iserv/login_check")
            login_query = QUrlQuery()
            login_query.addQueryItem("Class", "login-form")
            login_query.addQueryItem("Method", "post")
            login_query.addQueryItem("_username", "...")
            login_query.addQueryItem("_password", "...")
            login_query.addQueryItem("_remember_me", "0")
            login_url.setQuery(login_query)
            self.webview.load(login_url)
            print(login_url.toString())


def main():
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

相关问题 更多 >