2017-12-12 6 views
1

私はPythonでより良いコーディング方法を見つけようとしています。(QDialog)変数を保存するための別の方法は、たとえ閉じても(Parenting ??)

要約:閉じるダイアログボックス(別のクラス内で呼び出された)に入力された変数値を保持する(およびアクセスする)より良い方法を見つける。どちらのクラスからでもこれらの値を使用できる必要があります。

QtDesignerを使用してメインウィンドウとダイアログボックスを作成しました。メインウィンドウから「設定」メニューをクリックすると、「MyDialog」が開きます。そこに私はいくつかの設定を変更することができます。また、設定を保存するためのダイアログに「保存」ボタンがあります。ここでは例のコードは次のとおりです。

up = down = left = right = 0 

class MainForm(QMainWindow): 
    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 
     self.ui = Ui_MainForm() 
     self.ui.setupUi(self) 

     self.ui.actionSettings.triggered.connect(self.open_my_dialog) 

    def open_my_dialog(self): 
     my_dialog = MyDialog() 
     my_dialog.exec_() 


class MyDialog(QDialog): 
    def __init__(self, parent=None): 
     super(MyDialog, self).__init__(parent) 
     self.ui = Ui_MyDialog() 
     self.ui.setupUi(self) 

     self.ui.pushButton_save.clicked.connect(self.save_dialog) 

     self.ui.spinBox_up.setValue(up) 
     self.ui.spinBox_down.setValue(down) 
     self.ui.spinBox_left.setValue(left) 
     self.ui.spinBox_right.setValue(right) 

    def save_dialog(self): 
     global up, down, left, right 

     up = self.ui.spinBox_up.value() 
     down = self.ui.spinBox_down.value() 
     left = self.ui.spinBox_left.value() 
     right = self.ui.spinBox_right.value() 
     self.close() 

私はそれがクラス(MainFormをするか、再度ダイアログを再入力してのいずれかから閉鎖された後、ダイアログボックスに入力した値にアクセスできるようにする必要があります。MyFormを( )とMyDialog())。ご覧のとおり、キャッシュ内の設定を保持する方法は、それらをグローバル変数に割り当てることです。私はこれが正しい方法ではないことを知っています。しかし、「保存」ボタンをクリックすると設定を保存しておく必要があります。そのため、ダイアログを再度開くと、最後に残した設定が表示されます(保存をクリックしたとき)。また、私は私のMainForm()クラスからこれらの同じ値を使用する必要があります。私は他のクラスのクラスとメソッドの変数を呼び出すことに関して多くを読んでいました。また、子育て(これは私がちょっと混乱してしまった)。しかし、例は非常に単純化されていました。彼らがあなたに与えたもののように、最初からクラスを書くと分かります。しかし、私はUiのためにデザイナーを使用しているので、私は別のコード(たくさんのself.ui.xxx(xxselfxx)のものがあります)(initは例のオンラインとは異なります)。答えのためにたくさんの検索が、あきらめ、グローバル変数でそれを解決した。

いくつかのいずれかが、親切にこのケースを解決するための適切な(Python的)な方法は、私は非常にGREATFULになりますがどうあるべきか私に説明たい場合。

ありがとう!

+0

私はクラス変数を使用して解決策を見つけました!今はとても遅いです。しかし、明日、私は答えを掲載することを願っています。 –

答えて

0

テストと研究の時間がたってから、私はコーディングのためのより良いアプローチを見つけました。以前のようにグローバル変数に悩まずに代わりにコードを完成させましたクラス変数を使用します。また、インスタンス変数でも動作させようとしましたが、私が何をしてもうまくいきませんでした。私が提供している答えはもっとPythonic /適切な方法です。私はそれを確信しています。しかし、それが最良の方法であるとは限りません。私はまだ提案のために開いています。あなたはそれがより良い(インスタンス変数はおそらく?)書くことができると信じるならば、ぜひ共有してください。ここで

あなたが行く:

class MainForm(QMainWindow): 
    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 
     self.ui = Ui_MainForm() 
     self.ui.setupUi(self) 

     self.ui.actionSettings.triggered.connect(self.open_my_dialog) 

    def open_my_dialog(self): 
     my_dialog = MyDialog() 
     print("Test:", MyDialog.up, MyDialog.down, MyDialog.left, MyDialog.right) # for testing the values from this class 
     my_dialog.exec_() 


class MyDialog(QDialog): 
    up = down = left = right = 0 
    def __init__(self, parent=None): 
     super(MyDialog, self).__init__(parent) 
     self.ui = Ui_MyDialog() 
     self.ui.setupUi(self) 

     self.ui.pushButton_save.clicked.connect(self.save_dialog) 

     self.ui.spinBox_up.setValue(MyDialog.up) 
     self.ui.spinBox_down.setValue(MyDialog.down) 
     self.ui.spinBox_left.setValue(MyDialog.left) 
     self.ui.spinBox_right.setValue(MyDialog.right) 

    def save_dialog(self): 
     MyDialog.up = self.ui.spinBox_up.value() 
     MyDialog.down = self.ui.spinBox_down.value() 
     MyDialog.left = self.ui.spinBox_left.value() 
     MyDialog.right = self.ui.spinBox_right.value() 
     self.close() 
     return MyDialog.up, MyDialog.down, MyDialog.left, MyDialog.right 
関連する問題