반응형
로그인 화면이있는 스크립트가 있고 취소 버튼을 누르면 응용 프로그램을 모두 종료하고 싶습니다. 세 가지 방법을 시도했습니다.
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
반응형
'파이썬' 카테고리의 다른 글
파이썬 클래스 메서드의 목적은 무엇입니까? (0) | 2020.11.02 |
---|---|
파이썬 Python에서 문자열의 개별 문자를 반복하는 방법 (0) | 2020.11.02 |
파이썬 py 스크립트에서 sys.setdefaultencoding ( "utf-8")을 사용하지 않는 이유는 무엇입니까? (0) | 2020.11.01 |
파이썬 차트를 더 크게 만들기 (0) | 2020.11.01 |
파이썬 Python 단위 테스트에서 메서드가 호출되었는지 확인 (0) | 2020.11.01 |
댓글