python - 尝试 Catch 块在 QCompleter for pyqt5 中未捕获异常
问题描述
我有一个 qcompleter 设置,以便在突出显示建议时填充两个不同的 lineEdits。当用户使用箭头遍历建议并超出范围时,会引发索引错误。例如,如果完成者给出了一个建议,但用户点击了两次向下箭头,则所选建议超出范围并引发异常。错误是我将它包围在 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_())
回溯(最后一次调用):文件“stack.py”,第 13 行,在 QtCore.QTimer.singleShot(0, lambda: self.lineEdit.setText(nameList[1])) IndexError: list index out of range
解决方案
主要的不理解是,在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_())
推荐阅读
- windows - 无法在 Windows 中运行系统命令
- centos - 升级到流后 LDAP 中断
- python - 文件名中的 Python 通配符
- python - conda search 找不到可以在 conda cloud 上找到的包
- ios - 如何在 iOS 图表中制作虚线?
- javascript - 尝试使用 jquery 克隆 HTML 类,但我使用克隆的每个方法都复制了无数次
- c# - C# 到 C++ CopyData API
- vb.net - 有没有办法在 VB.net 中播放不是 console.bleep 的音符?
- php - Laravel-Paypal 结帐按钮未显示
- python-3.x - 文件层次结构和本地导入