【问题标题】:check existing list items else add item检查现有列表项 其他添加项
【发布时间】:2020-10-07 12:03:53
【问题描述】:

我需要从用户输入中检查列表中的重复项。

所以如果再次输入“Usa”,就会出现一个错误,说那是无效的

add 连接到一个按钮:

Add 部分是它被破坏的地方,它显示所有但在消息框弹出后失败。

我尝试同时使用 try 和 if 语句,但我的主要问题是我不确定 text.listwidget 的输入存储在哪里

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QInputDialog, QDialog, QLineEdit, QMessageBox ,QLabel


class Window(QDialog):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(580, 600)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog)
        self.verticalLayout_2.setContentsMargins(15, 15, 15, 15)
        self.verticalLayout_2.setSpacing(6)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setContentsMargins(15, 15, 15, 15)
        self.horizontalLayout.setSpacing(6)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.listWidget = QtWidgets.QListWidget(Dialog)
        self.listWidget.setObjectName("listWidget")
        self.horizontalLayout.addWidget(self.listWidget)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setContentsMargins(15, 15, 15, 15)
        self.verticalLayout.setSpacing(6)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton_add = QtWidgets.QPushButton(Dialog)
        self.pushButton_add.setObjectName("pushButton_add")
        self.verticalLayout.addWidget(self.pushButton_add)
        self.pushButton_edit = QtWidgets.QPushButton(Dialog)
        self.pushButton_edit.setObjectName("pushButton_edit")
        self.verticalLayout.addWidget(self.pushButton_edit)
        self.pushButton_remove = QtWidgets.QPushButton(Dialog)
        self.pushButton_remove.setObjectName("pushButton_remove")
        self.verticalLayout.addWidget(self.pushButton_remove)
        self.pushButton_up = QtWidgets.QPushButton(Dialog)
        self.pushButton_up.setObjectName("pushButton_up")
        self.verticalLayout.addWidget(self.pushButton_up)
        self.pushButton_down = QtWidgets.QPushButton(Dialog)
        self.pushButton_down.setObjectName("pushButton_down")
        self.verticalLayout.addWidget(self.pushButton_down)
        self.pushButton_sort = QtWidgets.QPushButton(Dialog)
        self.pushButton_sort.setObjectName("pushButton_sort")
        self.verticalLayout.addWidget(self.pushButton_sort)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.pushButton_close = QtWidgets.QPushButton(Dialog)
        self.pushButton_close.setObjectName("pushButton_close")
        self.verticalLayout.addWidget(self.pushButton_close)
        self.horizontalLayout.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
        self.pushButton_add.clicked.connect(self.add)
        self.pushButton_edit.clicked.connect(self.edit)
        self.pushButton_remove.clicked.connect(self.remove)
        self.pushButton_up.clicked.connect(self.up)
        self.pushButton_down.clicked.connect(self.down)
        self.pushButton_sort.clicked.connect(self.sort)
        self.pushButton_close.clicked.connect(self.close)

        self.label_1 = QLabel(self)
        self.label_1.setText("Enter a country: ")
        self.label_1.move(10, 580)
        self.label_1.resize(280, 40)

        self.Country()

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Covid country"))
        Dialog.setWindowIcon(QIcon("icon.png"))
        self.pushButton_add.setText(_translate("Dialog", "Add"))
        self.pushButton_edit.setText(_translate("Dialog", "Edit"))
        self.pushButton_remove.setText(_translate("Dialog", "Remove"))
        self.pushButton_up.setText(_translate("Dialog", "Up"))
        self.pushButton_down.setText(_translate("Dialog", "Down"))
        self.pushButton_sort.setText(_translate("Dialog", "Sort"))
        self.pushButton_close.setText(_translate("Dialog", "Close"))

    def Country(self):

        self.country = []
        self.listWidget.addItems(self.country)
        self.listWidget.setCurrentRow(0)

    def add(self):
        row = self.listWidget.currentRow()
        text, ok = QInputDialog.getText(self, "Country", "Enter country")
        texts = self.listWidget.items()
        if ok and text is not None:
            self.listWidget.insertItem(row, text)
        if texts in self.listWidget.items():
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setText("No country selected.")
            msg.setWindowTitle("Error")
            msg.exec_()
            return


    def edit(self):
        row = self.listWidget.currentRow()
        item = self.listWidget.item(row)

        if item is not None:
            string, ok = QInputDialog.getText(self, "Country Dialog", "Edit Country",
                                              QLineEdit.Normal, item.text())
            if ok and string is not None:
                item.setText(string)

    def remove(self):
        row = self.listWidget.currentRow()
        item = self.listWidget.item(row)

        if item is None:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setText("No country selected.")
            msg.setWindowTitle("Error")
            msg.exec_()
            return

        reply = QMessageBox.question(self, "Remove Country", "Do You Want To Remove Country " + str(item.text()),
                                     QMessageBox.Yes | QMessageBox.No)

        if reply == QMessageBox.Yes:
            item = self.listWidget.takeItem(row)
            del item

    def up(self):
        row = self.listWidget.currentRow()
        if row >= 1:
            item = self.listWidget.takeItem(row)
            self.listWidget.insertItem(row - 1, item)
            self.listWidget.setCurrentItem(item)

    def down(self):
        row = self.listWidget.currentRow()
        if row < self.listWidget.count() - 1:
            item = self.listWidget.takeItem(row)
            self.listWidget.insertItem(row + 1, item)
            self.listWidget.setCurrentItem(item)

    def sort(self):
        self.listWidget.sortItems()

    def close(self):
        quit()

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Window()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 你有什么问题?
  • 我如何检查输入是否不是列表中的现有项目,如果是则抛出错误。如果没有,则将该项目添加到列表中
  • 那么现有的代码在哪些方面不尽如人意?我想你已经运行了它,并且看到了我们读者目前仍然不知道的一些不良行为。您可能想对问题添加一些解释。
  • 它不这样做,我不确定为什么应用程序打开,我点击添加,输入并点击确定,然后失败
  • 你能分享一个最小可复制的例子吗?我们无法运行您的示例代码。

标签: python python-3.x pyqt5


【解决方案1】:

self.listWidget.items() 这一行并不是用来获取所有物品的。

返回指向数据对象中包含的项的指针列表。如果对象不是由同一进程中的 QListWidget 创建的,则列表为空。

要获取里面的所有项目,您可以像在 previously answered question 中一样解决它

items = []
for x in range(self.listWidget.count()-1):
    items.append(self.listWidget.item(x))

我也会使用QListWidget.findItems(text, flags)

def add(self):
    row = self.listWidget.currentRow()
    text, ok = QInputDialog.getText(self, "Country", "Enter country")
    if ok and text is not None:
        items = self.listWidget.findItems(text,QtCore.Qt.MatchExactly)
        if not items:
            self.listWidget.insertItem(row, text)
        else:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setText("No country selected.")
            msg.setWindowTitle("Error")
            msg.exec_()
            return

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 2021-12-16
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多