2017-12-20 44 views
0

ポップアップウィンドウの結果に問題があります。以下では、問題を理解するためのコードの一部を示しました。確認ダイアログの結果を取得する方法

これは、ユーザーがGUIで何らかの選択を行う一種のポップアップウィンドウです。この後、「Are you sure?」という質問と「はい」と「いいえ」の2つのボタンがあるウィンドウが表示されます。

問題は、以下のコード(msg.show()の前後)をテストすると、同じ値がFalseに設定されていることです。

なぜそれがこのように動作しdoesntの:関数の前に

  • - >False
  • は、他のTrueを与える、「はい」私の窓を表示し、私はボタンをクリックした場合、ボタン
  • をクリックするのを待ちますFalse

どのようにこれを正しく処理できますか?別の方法がありますか?

from PyQt4 import QtCore, QtGui 
from Message import Ui_Message 
import sys 

class MessageBox(QtGui.QDialog): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent=None) 
     self.msg = Ui_Message() 
     self.msg.setupUi(self) 
     self.confirmed=False 
     self.declined=False 

     QtCore.QObject.connect(self.msg.NoButton, QtCore.SIGNAL(("clicked()")), self.Declined) 
     QtCore.QObject.connect(self.msg.YesButton, QtCore.SIGNAL(("clicked()")), self.Confirmed) 

    def Confirmed(self): 
     self.confirmed = True 
     MessageBox.close(self) 
     return True 

    def Declined(self): 
     self.declined = True 
     MessageBox.close(self) 



if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    msg = MessageBox() 
    print('Befor show window',msg.confirmed) 
    msg.show() 
    print('After show window', msg.confirmed) 
    sys.exit(app.exec_()) 

答えて

0

あなたは前にウィンドウが閉じられた「ショーウィンドウの後、」印刷されているので、あなたの例では、動作しません。それはそのブロックではなく、show()方法exec()方法ですので、あなたの例は次のように書かれる必要があるでしょう:

app = QtGui.QApplication(sys.argv) 
msg = MessageBox() 
print('Before show window', msg.confirmed) 
msg.show() 
app.exec_() # this blocks, waiting for close 
print('After show window', msg.confirmed) 
sys.exit() 

しかし、アクションを確認するダイアログを使用する方法を示すはるかに現実的な例は次のようになりこのようなもの:

import sys 
from PyQt4 import QtCore, QtGui 

class MessageBox(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(MessageBox, self).__init__(parent) 
     self.yesButton = QtGui.QPushButton('Yes') 
     self.noButton = QtGui.QPushButton('No') 
     layout = QtGui.QGridLayout(self) 
     layout.addWidget(QtGui.QLabel('Are you sure?'), 0, 0) 
     layout.addWidget(self.yesButton, 1, 0) 
     layout.addWidget(self.noButton, 1, 1) 
     self.yesButton.clicked.connect(self.accept) 
     self.noButton.clicked.connect(self.reject) 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.button = QtGui.QPushButton('Do Something') 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.button) 

    def handleButton(self): 
     if self.confirmSomething(): 
      print('Yes') 
     else: 
      print('No') 

    def confirmSomething(self): 
     msg = MessageBox(self) 
     result = msg.exec_() == QtGui.QDialog.Accepted 
     msg.deleteLater() 
     return result 

if __name__ == "__main__": 

    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    app.exec_() 
関連する問題