首页 > 解决方案 > PyQT5开发

问题描述

我正在开发一个名为 duplication finder 的 GUI 应用程序。它的作用是,如果用户键入或检查一堆名称,它会找出重复的名称并输出不重复的名称并按字母顺序排序。

现在,我想进一步开发它,因为它只是 0.0 版本。

1)当我调整窗口大小时,输入和输出框和按钮以相同的大小固定在相同的位置。我希望他们根据窗口的大小调整大小和重新定位。

2)我希望占位符文本更大并在文本框的中心对齐。

3) 我的 closeEvent 函数不起作用。我想问用户他们是否真的想退出。

4)最后,我无法让文件菜单中的子菜单工作。“新建”应该清除框中的所有文本(输入和输出)基本上重新启动应用程序。“文件”菜单中的“退出”按钮应该从上面的数字 3 中提出相同的问题。

我尝试进行了很多研究,但这些是我唯一无法弄清楚的问题。

import sys
import re
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QMessageBox

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("Duplication Finder")
        MainWindow.resize(919, 728)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.Enter_button = QtWidgets.QPushButton(self.centralwidget)
        self.Enter_button.setGeometry(QtCore.QRect(380, 330, 151, 51))
        self.Enter_button.setObjectName("Enter_button")
        self.Text_box = QtWidgets.QTextEdit(self.centralwidget, placeholderText="Please insert Text")
        self.Text_box.setGeometry(QtCore.QRect(20, 30, 881, 271))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.Text_box.setFont(font)
        self.Text_box.setObjectName("Text_box")
        self.Result_box = QtWidgets.QTextEdit(self.centralwidget)
        self.Result_box.setGeometry(QtCore.QRect(20, 410, 881, 271))
        self.Result_box.setObjectName("Result_box")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 919, 21))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        self.menuEdit = QtWidgets.QMenu(self.menubar)
        self.menuEdit.setObjectName("menuEdit")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionNew = QtWidgets.QAction(MainWindow)
        self.actionNew.setObjectName("actionNew")
        self.actionExit = QtWidgets.QAction(MainWindow)
        self.actionExit.setObjectName("actionExit")
        self.menu.addAction(self.actionNew)
        self.menu.addAction(self.actionExit)
        self.menubar.addAction(self.menu.menuAction())
        self.menubar.addAction(self.menuEdit.menuAction())

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Duplication Finder v0.0"))
        self.Enter_button.setText(_translate("MainWindow", "Type"))
        self.menu.setTitle(_translate("MainWindow", "File"))
        self.menuEdit.setTitle(_translate("MainWindow", "Edit"))
        self.actionNew.setText(_translate("MainWindow", "New"))
        self.actionExit.setText(_translate("MainWindow", "Exit"))

    def closeEvent(self, QCloseEvent):
        ans = QMessageBox.question(self, "Exit", "Do you want to Exit?",
                                   QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if ans == QMessageBox.Yes:
            QCloseEvent.accept()
        else:
            QCloseEvent.ignore()





class MyApp(Ui_MainWindow):
    def __init__(self, dialog):
        Ui_MainWindow.__init__(self)
        self.setupUi(dialog)

        self.Enter_button.clicked.connect(self.duplication)

    def duplication(self):
        text = self.Text_box.toPlainText()
        text = re.split(", |-|  |,", text)  # split based on the delimeter in the argument.
        text = [s.strip() for s in text]  # remove all the leading spaces in each elements of the list
        name = list(filter(None, text))  # drop all the empty elements and put them in a list

        i = 0

        names = []
        remove = []

        # go through all the elements in the list and see if they are duplicated.
        while i < len(name):
            each_name = name[i].strip()
            if each_name.startswith(("*", "-")):
                continue  # straight to next line
            if each_name not in names:
                names.append(each_name)
            elif each_name in names:
                remove.append(each_name)

            i += 1

        # sort the list and send "무명' to the very end.
        sort_names = sorted(names, key=lambda x: (x.startswith("무명"), x))
        sort_names = ", ".join(sort_names)

        output_string = f'\n\nDuplication: {(sorted(remove))}\n\nTotal of {len(remove)}duplications are are removed, Total of {len(names)}people are printed.\n\n {sort_names}'

        self.Result_box.setText(output_string)



if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    dialog = QMainWindow()

    prog = MyApp(dialog)

    dialog.show()
    sys.exit(app.exec_())

标签: pythonuser-interfacepyqt5

解决方案


试试看:

import sys
import re
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QMessageBox


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("반복 단어 찾기")
        MainWindow.resize(919, 728)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.Enter_button = QtWidgets.QPushButton(self.centralwidget)
        self.Enter_button.setGeometry(QtCore.QRect(380, 330, 151, 51))
        self.Enter_button.setObjectName("Enter_button")
        self.Text_box = QtWidgets.QTextEdit(self.centralwidget, placeholderText="Please insert Text")
        self.Text_box.setGeometry(QtCore.QRect(20, 30, 881, 271))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.Text_box.setFont(font)
        self.Text_box.setObjectName("Text_box")
        self.Result_box = QtWidgets.QTextEdit(self.centralwidget)
        self.Result_box.setGeometry(QtCore.QRect(20, 410, 881, 271))
        self.Result_box.setObjectName("Result_box")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 919, 21))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        self.menuEdit = QtWidgets.QMenu(self.menubar)
        self.menuEdit.setObjectName("menuEdit")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionNew = QtWidgets.QAction(MainWindow)
        self.actionNew.setObjectName("actionNew")

### 4.1
        self.actionNew.triggered.connect(self.clearTextEdit)

        self.actionExit = QtWidgets.QAction(MainWindow)
        self.actionExit.setObjectName("actionExit")

### 4.2        
        self.actionExit.triggered.connect(self.close)

        self.menu.addAction(self.actionNew)
        self.menu.addAction(self.actionExit)
        self.menubar.addAction(self.menu.menuAction())
        self.menubar.addAction(self.menuEdit.menuAction())

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Duplication Finder v0.0"))
        self.Enter_button.setText(_translate("MainWindow", "Type"))
        self.menu.setTitle(_translate("MainWindow", "File"))
        self.menuEdit.setTitle(_translate("MainWindow", "Edit"))
        self.actionNew.setText(_translate("MainWindow", "New"))
        self.actionExit.setText(_translate("MainWindow", "Exit"))

#    def closeEvent(self, QCloseEvent):
#        ans = QMessageBox.question(self, "Exit", "Do you want to Exit?",
#                                   QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
#        if ans == QMessageBox.Yes:
#            QCloseEvent.accept()
#        else:
#            QCloseEvent.ignore()


class MyApp(QMainWindow, Ui_MainWindow):    # +++ QMainWindow
#    def __init__(self, dialog):
#        Ui_MainWindow.__init__(self)
#        self.setupUi(dialog)
    def __init__(self):
        super().__init__()
        self.setupUi(self)

### 2        
        self.Text_box.setStyleSheet('font-size: 24pt;')
        self.Text_box.setPlaceholderText("Please insert Text")

        self.Enter_button.clicked.connect(self.duplication)

### 1   I want them to resize and relocate depending on the size of the window.       
        grid = QtWidgets.QGridLayout(self.centralwidget)
        grid.addWidget(self.Text_box,     0, 0) 
        grid.addWidget(self.Enter_button, 1, 0)
        grid.addWidget(self.Result_box,   2, 0)


    def duplication(self):
        text = self.Text_box.toPlainText()
        text = re.split(", |-|  |,", text)  # split based on the delimeter in the argument.
        text = [s.strip() for s in text]  # remove all the leading spaces in each elements of the list
        name = list(filter(None, text))  # drop all the empty elements and put them in a list

        i = 0

        names = []
        remove = []

        # go through all the elements in the list and see if they are duplicated.
        while i < len(name):
            each_name = name[i].strip()
            if each_name.startswith(("*", "-")):
                continue  # straight to next line
            if each_name not in names:
                names.append(each_name)
            elif each_name in names:
                remove.append(each_name)

            i += 1

        # sort the list and send "무명' to the very end.
        sort_names = sorted(names, key=lambda x: (x.startswith("무명"), x))
        sort_names = ", ".join(sort_names)

#        output_string = f'\n\n중복된 사람: {(sorted(remove))}\n\n총 {len(remove)}명이 중복되어 삭제 되었고, 총 {len(names)}명이 출력되었습니다.\n\n {sort_names}'
        output_string = '''\n\n중복된 사람: {}
            \n총 {}명이 중복되어 삭제 되었고, 총 {}명이 출력되었습니다.
            \n {}'''.format(sorted(remove), len(remove), len(names), sort_names)

        self.Result_box.setText(output_string)

### 4.1
    def clearTextEdit(self):
        self.Text_box.setText("")
        self.Result_box.setText("")  

### 3, 4.2
    def closeEvent(self, QCloseEvent):
        ans = QMessageBox.question(self, "Exit", "Do you want to Exit?",
                                   QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if ans == QMessageBox.Yes:
            QCloseEvent.accept()
        else:
            QCloseEvent.ignore()



if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
### 2    
    app.setFont(QtGui.QFontDatabase().font("Monospace", "Regular", 23))    

#    dialog = QMainWindow()
#    prog = MyApp(dialog)
    prog = MyApp()

#    dialog.show()
    prog.show()
    sys.exit(app.exec_())

在此处输入图像描述


推荐阅读