Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Proper way to quit/exit a PyQt program

Tags:

I have a script which has a login screen and if the cancel button is pressed, I want to exit the application altogether. I have tried 3 ways:

  1. sys.exit()
  2. QApplication.quit()
  3. QCoreApplication.instance().quit()

Only number 1 works. The other two makes the dialog box white and it flashes then hangs and I cannot even switch to other applications. My code is below:

from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtSql import * from PyQt5.QtWidgets import *   import csv import sys from datetime import datetime, timedelta, time import os  from ci_co_table import * from login import *  class Ci_Co(QMainWindow):     """Check in and check out module"""      def __init__(self, parent=None):         QWidget.__init__(self, parent)         self.ui = Ui_MainWindow()         self.ui.setupUi(self)  class Login(QDialog):     """User login """     def __init__(self):         QDialog.__init__(self)         self.ui = Ui_login_form()         self.ui.setupUi(self)         self.ui.buttonBox.accepted.connect(lambda: self.handle_login(servers=servers))         servers = {}         with open('servers.csv', newline='') as csvfile:             server_reader = csv.reader(csvfile)             for row in server_reader:                 self.ui.cbo_db_name.addItem(row[1])                 servers[row[1]] = (row[0],row[2])      def handle_login(self, servers=''):         global user         global pword         global database         global server         global bg_colour         user = self.ui.username.text()         pword = self.ui.password.text()         database = self.ui.cbo_db_name.currentText()         server = servers[database][0]         bg_colour = servers[database][1]   if __name__=="__main__":     app=QApplication(sys.argv)     global hotdate     global hotdate_string     global folio_num     global user     global pword     global dbase     global server     pword = ""     global database     global bg_colour     #Login     while True:         if Login().exec_() == QDialog.Accepted:             db = QSqlDatabase.addDatabase("QPSQL");             db.setHostName(server)             db.setDatabaseName(database);             db.setUserName(user);             db.setPassword(pword)             if (db.open()==False):                      QMessageBox.critical(None, "Database Error", db.lastError().text())             else:                 break         else:             #QApplication.quit()             QCoreApplication.instance().quit()                         #sys.exit()       myapp = Ci_Co()     myapp.show()     sys.exit(app.exec_()) 
like image 541
Dkellygb Avatar asked Jul 09 '16 16:07

Dkellygb


People also ask

How do I close a PyQt window?

The simplest way to close a window is to click the right (Windows) or left (macOS) 'X' button on the title bar.

How do I close QApplication in Python?

QApplication , or try the search function . def close_all(self): QApplication. quit() # Main entry to program.

What does app exec _() do?

app. exec_() does not lock anything, it runs a GUI event loop that waits for user actions (events) and dispatches them to the right widget for handling.


1 Answers

Calling QCoreApplication.quit() is the same as calling QCoreApplication.exit(0). To quote from the qt docs:

After this function has been called, the application leaves the main event loop and returns from the call to exec(). The exec() function returns returnCode. If the event loop is not running, this function does nothing. [emphasis added]

So quit() or exit() are nothing like sys.exit(). The latter will terminate the program, but the former will merely terminate the event-loop (if it's running).

When the user cancels the login dialog, your example should just call sys.exit() to terminate the program. Otherwise, your program will just get stuck in the blocking while-loop.

like image 173
ekhumoro Avatar answered Oct 16 '22 00:10

ekhumoro