2017-12-12 24 views
1

저는 Python으로 코딩하는 더 좋은 방법을 찾으려고합니다. (단 몇주 만 코딩했습니다.)(QDialog) 변수를 저장할 때 다른 변수를 닫을 때도 마찬가지입니다 (Parenting ??)

요약 : 닫는 대화 상자 (다른 클래스에서 호출 됨)에 입력 된 변수 값을 유지하고 (액세스하는) 더 나은 방법을 찾는 것. 두 클래스에서이 값을 사용할 수 있어야합니다.

QtDesigner를 사용하여 주 윈도우와 대화 상자를 만들었습니다. 메인 윈도우에서 "설정"메뉴를 클릭하면 "MyDialog"가 열립니다. 거기에 변경할 수있는 몇 가지 설정이 있습니다. 내 설정을 저장하기 위해 대화 상자에 "저장"버튼이 있습니다. 다음은 예시적인 코드 :

이 클래스 (MainForm 중 하나 또는 대화 상자를 다시 재 입력하여 폐쇄 된 후에 I 대화 상자에 입력 된 값에 액세스 할 수 있어야
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() 

;을 MyForm () 및 MyDialog()). 보시다시피 캐시에서 설정을 유지하는 방법은 전역 변수에 할당하는 것입니다. 나는 이것이 이것을하는 적절한 방법이 아니라는 것을 안다. 하지만 "저장"버튼을 클릭하면 설정을 저장해야하므로 대화 상자를 다시 열면 마지막으로 왼쪽에있는 설정 (저장을 클릭했을 때)이 표시됩니다. 또한 내 MainForm() 클래스에서 이러한 동일한 값을 사용해야합니다. 다른 클래스에서 클래스 및 메서드 변수를 호출하는 것과 관련하여 많은 내용을 읽었습니다. 또한 육아 (이 하나는 나를 조금 혼란스럽게했다). 그러나 예제는 매우 단순했습니다. 나는 그들이 당신에게주는 것과 같이 처음부터 수업을 작성하면 이해합니다. 하지만 Ui 용 디자이너를 사용하고 있기 때문에 (예 : 초기화은 다른 예제 코드와는 다른 방식으로) 다른 코드 (self.ui.xxx (xxselfxx)를 많이 사용합니다.)를 시도해 보았습니다. 대답을 많이 검색된하지만 포기하고 글로벌 변수를 해결했다.

을 어떤 하나 친절하게이 사건을 해결하는 적절한 (파이썬) 방법은 내가 매우 greatful 될 것입니다 어떻게해야 나에게 설명한다면.

감사합니다.

+0

내가 클래스 변수를 사용하여 해결책을 발견! 지금은 매우 늦었습니다. 그러나 잘하면 내일 대답을 게시 할 것입니다. –

답변

0

많은 시간 동안 테스트하고 연구 한 결과 필자는 코딩의 더 나은 접근 방식을 발견했습니다. 이전에 보았던 것처럼 전역 변수에 대해 frowned를 사용하는 대신 이제 코드를 완성 할 수 있습니다. 클래스 변수를 사용합니다. 또한 인스턴스 변수와 함께 작동 시키려고했지만 불행히도 내가 한 것에 상관없이 작동하지 않았습니다. 내가 제공하는 대답은 더 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