2016-04-17 5 views
0

sys.argvを使用してコマンドラインで入力フラグを使用する代わりに、Pythonプログラムを変更して、ダイアログボックスを持つGUIでユーザーがいくつかの質問に対する回答を提供できるようにします。 "適用"ボタンが押された後、私はダイアログGUIを消してから、ダイアログボックスで提供される変数で正常に動作するようにします。私はQtGuiを使っていろいろな方法で試しました。クラッシュするか、メインプログラムの答えがわかりません。私は私の多くの試みの一つを以下に示します。この例では、適用ボタンが押された後の答えは分かりません。出力は、私は非常に多くの変数「A1」がダイアログボックスで指定した文字列で満たされているように、このコードを変更する方法について助けいただければ幸いですQtGuiをPyQt4で使用して、Pythonプログラムに入力変数を収集する方法はありますか?

after widget answer1 = <blank no matter what I write in the dialog box> 

です。 ありがとうございました!

import sys 
from PyQt4 import QtGui 

class Widget(QtGui.QWidget): 

    def __init__(self): 
     super(Widget, self).__init__() 

     self.answer1 = QtGui.QLabel() 
     q1Edit = QtGui.QLineEdit() 
     q1Edit.textChanged[str].connect(self.q1Changed) 

     grid = QtGui.QGridLayout() 
     grid.setSpacing(20) 

     grid.addWidget(QtGui.QLabel('Question 1'), 1, 0) 
     grid.addWidget(q1Edit, 1, 1) 
     grid.addWidget(self.answer1, 1, 2) 

     applyBtn = QtGui.QPushButton('Apply', self) 
     applyBtn.clicked.connect(self.close) 

     self.answer1Text = self.answer1.text() 

     grid.addWidget(applyBtn,4,3) 

     self.setLayout(grid)  

     self.setGeometry(300, 300, 350, 300) 
     self.show() 


    def q1Changed(self, text): 
     self.answer1.setText(text) 

    def returnAnswer1(self): 
     return self.answer1Text 


def main():  
    app = QtGui.QApplication(sys.argv) 
    w = Widget() 
    a1 = w.returnAnswer1() 
    print("after widget answer1 = " + a1)  
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

JRazorのおかげで、これは終わりで解決した:

import sys 
from PyQt4 import QtGui 

class Widget(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(Widget, self).__init__(parent) 

     self.answer1 = QtGui.QLabel() 
     q1Edit = QtGui.QLineEdit() 
     q1Edit.textChanged.connect(self.q1Changed) 

     self.answer2 = QtGui.QLabel() 
     q2Edit = QtGui.QLineEdit() 
     q2Edit.textChanged.connect(self.q2Changed) 

     grid = QtGui.QGridLayout() 
     grid.setSpacing(20) 

     grid.addWidget(QtGui.QLabel('Question 1'), 1, 0) 
     grid.addWidget(q1Edit, 1, 1) 

     grid.addWidget(QtGui.QLabel('Question 2'), 2, 0) 
     grid.addWidget(q2Edit, 2, 1) 

     applyBtn = QtGui.QPushButton('Apply', self) 
     applyBtn.clicked.connect(self.close) 

     grid.addWidget(applyBtn,3,2) 
     self.setLayout(grid) 
     self.setGeometry(300, 300, 350, 300) 

    def q1Changed(self, text): 
     self.answer1.setText(text) 

    def q2Changed(self, text): 
     self.answer2.setText(text) 

    def returnAnswer1(self): 
     return self.answer1.text() 

    def returnAnswer2(self): 
     return self.answer2.text() 

    @staticmethod 
    def getData(parent=None): 
     dialog = Widget(parent) 
     dialog.exec_() 
     return [dialog.returnAnswer1(), dialog.returnAnswer2()] 

def main(): 
    app = QtGui.QApplication([]) 
    window = Widget() 
    data = window.getData() 
    print data[0] 
    print data[1] 


if __name__ == '__main__': 
    main() 

答えて

0

あなたはQDialogQWidgetを変更する必要があります。

class Widget(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(Widget, self).__init__(parent) 

次に静的メソッドでclass Widgetための関数を作成。関数は、ダイアログウィンドウに親を取得し、編集フィールドからテキストを返します。

@staticmethod 
def getData(parent = None): 
    dialog = Widget(parent) 
    dialog.exec_() 
    return dialog.returnAnswer1() 

は、次に値を渡すと、ウィンドウを呼び出します。

def main(): 
    app = QtGui.QApplication([]) 
    window = Widget() 
    print window.getData() # window is value from edit field 

はまた、あなたはクラスからself.show()を削除する必要があります。

全コード:https://gist.github.com/gitex/83b06e8ceaac18ad5dec2d332ed6cbaa

+0

こんにちはJRazor、ここで手伝ってくれてありがとう多くのことを...私は 'あなた'ウィンドウ= Widget.getData() 'の後が、編集で何かを書き込んだ後、'プリント(ウィンドウ)を追加しましたフィールドを適用して、Applyボタンを押すと、何が間違っているのか分かりませんか? – chan

+0

@chan:答えが更新されました(完全なコードも)。 – JRazor

+0

素晴らしい作品です!しかし、同じダイアログボックスに複数の質問を表示しようとすると、ダイアログボックスが2回開きます。どのようにそれを解決するための任意のアイデア?あなたの[github](https://gist.github.com/gitex/83b06e8ceaac18ad5dec2d332ed6cbaa) – chan

関連する問題