본문 바로가기
파이썬

파이썬 PyQt 프로그램을 종료 / 종료하는 적절한 방법

by º기록 2020. 11. 2.
반응형

로그인 화면이있는 스크립트가 있고 취소 버튼을 누르면 응용 프로그램을 모두 종료하고 싶습니다. 세 가지 방법을 시도했습니다.

1 번만 작동합니다. 나머지 두 개는 대화 상자를 흰색으로 만들고 깜박이다가 멈추고 다른 응용 프로그램으로 전환 할 수도 없습니다. 내 코드는 다음과 같습니다.

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

 

해결 방법

 


이 함수가 호출 된 후 응용 프로그램은 기본 event loop and returns from the call to exec(). The exec() function returns returnCode. If the event loop is not running, this function 아무것도하지 않습니다 . [강조 추가]

따라서 quit () 또는 exit () sys.exit () 와 다릅니다. 후자는 프로그램을 종료하지만 전자는 이벤트 루프를 종료합니다 (실행중인 경우).

사용자가 로그인 대화 상자를 취소하면 예제는 sys.exit () 를 호출하여 프로그램을 종료해야합니다. 그렇지 않으면 프로그램이 블로킹 while 루프에 갇히게됩니다.

 

참조 페이지 https://stackoverflow.com/questions/38283705

 

 

반응형

댓글