python - 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_())
解决方案
试试看:
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_())
推荐阅读
- python - QMainWindow 在被 QDialog 调用后没有被激活
- java - 如何在Java中找到一个月第一天的星期几(星期一,星期二等)?
- flutter - 如何将 FloatingActionButton 定位在屏幕的右下角
- azure - Azure 容器实例命令执行返回“没有这样的文件或目录”
- awk - 如何使用 awk 提取特定 VM 和组的 UUID?
- javascript - 在 .net core 5 pwa 中使用 navigator.setAppBadge()
- javascript - session_start() 不能在 firefox 和operamini 中运行,但在 microsoft edge 浏览器中运行良好
- java - 如何在 2021 年使用 Maven 构建 JavaFX 应用程序?
- python - 在pygame中移动时对象闪烁
- linux - 设置 Linux 文件句柄分配限制