Разработка PyQT5 - PullRequest
       8

Разработка PyQT5

0 голосов
/ 06 февраля 2019

Я занимаюсь разработкой приложения с графическим интерфейсом, которое называется поиск дубликатов.Что он делает, так это то, что если пользователь набирает или разбивает на группы несколько имен, он находит, какие имена дублируются, и выводит имена без дублирования и сортирует их в алфавитном порядке.

Теперь я хочу развить это еще дальше, посколькуэта версия была только 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_())

1 Ответ

0 голосов
/ 07 февраля 2019

Попробуйте:

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...