Try Catch block未捕获pyqt5的QCompleter中的异常

2024-05-19 12:36:59 发布

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

我有一个qcompleter设置,以便在突出显示建议时填充两个不同的行编辑。当用户使用箭头遍历建议并超出界限时,会引发索引错误。例如,如果完成符给出了一个建议,但是用户按了两次向下箭头,那么所选的建议就越界并引发异常。错误是我用一个try-except块来包围它,但是不管什么原因它都没有捕获异常。当用户试图越界时,是否可以强制突出显示的选择从索引0开始?你知道吗

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QCompleter


class Ui_MainWindow(object):

    def on_button(self, text):
        try:
            nameList = text.split(', ')
            self.lineEdit_2.setText(nameList[0])
            QtCore.QTimer.singleShot(0, lambda: self.lineEdit.setText(nameList[1]))

        except IndexError:
            print("Out of bounds")

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(439, 254)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(20, 90, 180, 25))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(240, 90, 180, 25))
        self.lineEdit_2.setObjectName("lineEdit_2")

        food = ["pizza, chikin", "chikin, pizza", "chikin, pizza pizza", "chikin, pizza", "fried, pizza"]

        completer = QCompleter(food)
        completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        completer.setFilterMode(QtCore.Qt.MatchContains)
        self.lineEdit.setCompleter(completer)

        try:

            completer.highlighted.connect(self.on_button)
            completer.activated.connect(self.on_button)

        except IndexError:
            print("Out of bounds")
        MainWindow.setCentralWidget(self.centralwidget)


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_())

回溯(最近一次呼叫): “文件”堆栈.py,第13行,在 QtCore.QTimer.singleShot(0,λ:self.lineEdit.setText文件(姓名列表[1])) 索引器错误:列表索引超出范围


Tags: 用户self错误建议tryexceptpizzaqtcore
3条回答

主要的不理解是在try ... except块中有连接函数和信号。不执行它们。你知道吗

节省计时器使用的解决方案:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QCompleter


class Ui_MainWindow(object):

    def on_button(self, text):
        if text not in self.food:
            self.lineEdit_2.setText("")
            return
        nameList = text.split(', ')
        self.lineEdit_2.setText(nameList[0])
        QtCore.QTimer.singleShot(0, lambda: self.lineEdit.setText(nameList[1]))


    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(439, 254)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(20, 90, 180, 25))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(240, 90, 180, 25))
        self.lineEdit_2.setObjectName("lineEdit_2")

        self.food = ["pizza, chikin", "chikin, pizza", "chikin, pizza pizza", "chikin, pizza", "fried, pizza"]

        completer = QCompleter(self.food)
        completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        completer.setFilterMode(QtCore.Qt.MatchContains)
        self.lineEdit.setCompleter(completer)

        try:

            completer.highlighted.connect(self.on_button)
            # completer.activated.connect(self.on_button)

        except IndexError:
            print("Out of bounds")
        MainWindow.setCentralWidget(self.centralwidget)


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_())

如果我没弄错的话,OP使用

QtCore.QTimer.singleShot

因此,要创建一个计时器事件,以便在索引1中设置文本后将列表索引切换回0。你知道吗

试着简单地设置文本

self.lineEdit.setText(nameList[1])

然后使用except块调用一个函数,该函数将在nameList中重新选择索引0。你知道吗

异常处理中的错误可能与计时器事件的活动运行时间有关-尽管我不确定。你知道吗

我只是运行了你的代码,不明白你为什么要在QTimer中更改lineEdit的值。我就是这么做的

self.lineEdit.setText(nameList[1])

以及索引器的建议和捕捉:我理解你的意图它。它错误可能来自QTimer内部的调用。也许你有理由这么做,但我不清楚。你知道吗

相关问题 更多 >