'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 |
