[英]Proper way to quit/exit a PyQt program
我有一個腳本,它有一個登錄屏幕,如果按下取消按鈕,我想完全退出應用程序。 我嘗試了 3 種方法:
只有 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_())
調用QCoreApplication.quit()
與調用QCoreApplication.exit(0)
。 引用qt 文檔:
調用此函數后,應用程序離開主事件循環並從對 exec() 的調用返回。 exec() 函數返回returnCode 。 如果事件循環沒有運行,這個函數什么都不做。 [強調]
所以quit()
或exit()
與sys.exit()
。 后者將終止程序,但前者只會終止事件循環(如果它正在運行)。
當用戶取消登錄對話框時,您的示例應該只調用sys.exit()
來終止程序。 否則,您的程序將卡在阻塞的 while 循環中。
而不是使用QApplication.quit()
,因為你定義了app = QApplication(sys.argv)
,你可以只寫app.quit()
,這應該可行!
一些無關但可能有用的東西:我認為如果您將登錄檢查放在Ci_Co
類的__init__
函數的開頭會更容易。 這樣,您將在開始時啟動Ci_Co
,但它會首先生成Login
類。 如果登錄失敗,您可以調用app.quit()
,如果成功,它會自動過渡到Ci_Co
。 這使您免於在if __name__ == "__main__"
子句中編寫許多內容。 如果您還有任何問題,請發表評論,我有一個帶有登錄對話框的類似項目。
將sys.exit(app.exec_())
添加到您的代碼中
我嘗試這 3 種方法來關閉我的MainWindow()
但它對我的代碼不起作用。
所以我使用self.close()
方法,它與我的代碼完全一致。
這是我的代碼
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.QPushButton.clicked.connect(lambda: self.shutprocess())
def shutprocess(self):
reply = QMessageBox.question(self, 'Window Close', 'Are you sure you want to close the window?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
self.close()
print('Window closed')
else:
pass
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.