2014-07-22 1 views
0

작은 응용 프로그램이 있으므로 시작하기 전에 로그인해야합니다. 그러나 사용자가 로그인을 거부하면 (취소 버튼 누름) 응용 프로그램이 닫히지 않고 그대로 멈 춥니 다.대화 상자가 거부 된 경우 PyQt 응용 프로그램이 작동을 멈 춥니 다.

import sys 

from PyQt5 import QtWidgets, QtCore 


class LoginWindow(QtWidgets.QDialog): 

    def __init__(self, parent=None): 
     super(LoginWindow, self).__init__(parent) 
     self.resize(250, 150) 
     self.move(500, 500) 
     self.setWindowTitle('Login') 
     self.login_input = QtWidgets.QLineEdit(self) 
     self.login_input.move(10, 10) 
     self.password_input = QtWidgets.QLineEdit(self) 
     self.password_input.move(10, 50) 
     self.password_input.setEchoMode(QtWidgets.QLineEdit.Password) 
     self.button_box = QtWidgets.QDialogButtonBox(self) 
     self.button_box.move(10, 80) 
     self.button_box.setOrientation(QtCore.Qt.Horizontal) 
     self.button_box.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel | 
              QtWidgets.QDialogButtonBox.Ok) 

     self.button_box.accepted.connect(self.login) 
     self.button_box.rejected.connect(self.reject) 

    def login(self): 
     self.accept() 

    def cancel(self): 
     self.reject() 


class MainWindow(QtWidgets.QDialog): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.resize(250, 150) 
     self.move(500, 500) 
     self.setWindowTitle('Main') 
     self.input = QtWidgets.QLineEdit(self) 
     self.input.move(10, 10) 
     self.show() 

def main(): 
    app = QtWidgets.QApplication([]) 
    l = LoginWindow() 
    l.show() 
    login_result = l.exec_() 
    print(login_result) 
    if login_result == QtWidgets.QDialog.Accepted: 
     m = MainWindow() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

내가 잘못 뭐하는 거지 : 여기

는 단순화 된 코드? 내가

답변

2

이것은 PySide가 어떤 이벤트도 처리하지 않았기 때문에 발생합니다.

app.exec_() 

이것은 모든 GUI 상호 작용을 지속적으로 처리하는 기본 이벤트 루프를 시작합니다. GUI 코드를 실행하기 전에이를 호출해야 이벤트가 이벤트 큐에서 올바르게 처리 될 수 있습니다.

QDialog.exec_()는 코드가 응답을 얻을 때까지 코드가 계속되는 것을 막는 차단 작업입니다.

대화 상자 항목을 보려면이 문제를 해결할 수 있습니다.

QtGui.QApplication.processEvents() 

이 이벤트 대기열의 모든 이벤트를 처리하므로이 메서드를 계속 호출해야합니다.

주 창을 초기화 한 후에도 주 창을 표시해야합니다.

0

내가이 버그를 방지 할 수있는 방법을 찾아 파이썬 3 PyQt5를 사용 :

나는 주요 기능 변경했습니다 :

def main(): 
    app = QtWidgets.QApplication([]) 
    if LoginWindow().exec_() == QtWidgets.QDialog.Accepted: 
     m = MainWindow() 
     sys.exit(app.exec_()) 

을 그리고 정상 작동하지만 여전히 이해할 수있다 , 문제의 근본 원인은 무엇입니까

관련 문제