'Pyqt5 - QCoreApplication::exec: The event loop is already running and page show problem

The program is running, but whenever I close the program by clicking the close button, I get the QCoreApplication::exec warning: The event loop is already running. The purpose of the program: When the user ctrl+v, the last 10 copied content will be displayed in a window item that opens at the mouse position.

second problem is: The new window is always minimized when first opened with ctrl+v. Later it is fixed but on the first ctrl+v event it is minimized

from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtCore import *
from PyQt5 import QtCore
from page import Open
from mainWindow import Ui_MainWindow
from PyQt5.Qt import Qt
import keyboard,pyperclip,time, cpProcess


class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
    
    
    self.ui.open_button.clicked.connect(self.open)
    self.ui.close_button.clicked.connect(self.close)
    #self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
    #self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    
def close(self):
    print("listener closed")
    sys.exit(app.exec_())
def open(self):
    #Giving information to user
    self.ui.lbl_info.setText('Running')
    self.ui.open_button.setStyleSheet("background-color : green")
    self.ui.close_button.setStyleSheet("background-color : midlight")

    print("listener working")
    #if program is run, the process will execute
    if self.ui.lbl_info.text() == "Running":
        #start another thread
        self.listener = Listener()
        self.listener.start()
        self.listener.finished.connect(self.listenerFinished)
        self.listener.val_bool.connect(self.showPage)
        self.listener.val_str.connect(self.showPage)

def showPage(self, val):
    self.list = set()
    print("show page val type:", type(val))
    if type(val) == str:
        #collect copyied texts to show list in new window
        self.list.add(val)
        self.loader = Open()
        self.loader.ui.groupBox.setTitle(val)
    if type(val) == bool and val == True:
        self.loader = Open()          
        self.loader.show()
    
def listenerFinished(self):
    print("Listener Done!")
    self.listener.exit()


class Listener(QThread): #Thread
    copyiedVal =  set()
    val_bool = pyqtSignal(bool)
    val_str = pyqtSignal(str)
    text = ""
    def run(self):
        while True:
            #check if ctrl+v is pressed
            if keyboard.is_pressed("ctrl+c"):
                self.text = pyperclip.paste()
                self.copyiedVal.add(self.text)
                #self.write()
                print(self.text) 
            
            if keyboard.is_pressed("ctrl+v"):
                self.val_bool.emit(True)
                self.val_str.emit(self.text)
            time.sleep(0.1)
    

def write(self):
    #This side will not run, just for checking
    with open("./test.txt",'a',encoding = 'utf-8') as f:
        for txt in self.copyiedVal:
            f.write(txt+"\n")
    self.copyiedVal.clear()







if __name__ == '__main__':
   import sys
   app = QApplication(sys.argv)
   main = Main()
   main.show()
   app.exit(app.exec_())

ui's code:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(316, 224)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lbl_info = QtWidgets.QLabel(self.centralwidget)
        self.lbl_info.setGeometry(QtCore.QRect(120, 140, 91, 16))
        self.lbl_info.setObjectName("lbl_info")
        self.open_button = QtWidgets.QPushButton(self.centralwidget)
        self.open_button.setGeometry(QtCore.QRect(40, 90, 75, 41))
        self.open_button.setCheckable(False)
        self.open_button.setObjectName("open_button")
        self.close_button = QtWidgets.QPushButton(self.centralwidget)
        self.close_button.setGeometry(QtCore.QRect(170, 90, 75, 41))
        self.close_button.setObjectName("close_button")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    self.lbl_info.setText(_translate("MainWindow", "Closed"))
    self.open_button.setText(_translate("MainWindow", "Open"))
    self.close_button.setText(_translate("MainWindow", "Close"))



                  

ui's code 2

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(295, 359)
        self.groupBox = QtWidgets.QGroupBox(Form)
        self.groupBox.setGeometry(QtCore.QRect(0, 0, 301, 361))
        self.groupBox.setObjectName("groupBox")

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

def retranslateUi(self, Form):
    _translate = QtCore.QCoreApplication.translate
    Form.setWindowTitle(_translate("Form", "Form"))
    self.groupBox.setTitle(_translate("Form", "Recent"))


Solution 1:[1]

Thanks first error solved ! But second problem still continue. here is first error's solution:

class Main(QMainWindow):
def __init__(self):
    super().__init__()
    self.ui = Ui_MainWindow()
    self.ui.setupUi(self)
    
    ###FUNCS
    self.ui.open_button.clicked.connect(self.open)
    self.ui.close_button.clicked.connect(lambda: self.shutdown_p())
    #self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
    #self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    
    
def shutdown_p(self):
    reply = QMessageBox.question(self, 'Window Close', 'Are you sure you want to close the window?', QMessageBox.Yes | QMessageBox.No)
    if reply == QMessageBox.Yes:
            self.close()
            print('Window closed')
    else:
        pass

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1