2014-12-03 2 views
1

필자는이 주제에 대해 적절한 '질문'을 생각하는 것보다 오래 머물렀다. 내 문제는 명확하게 표현하기가 어렵 기 때문에.Python/PySide에서 클래스 메서드 호출하기

  • 내가
  • 내가 특정 파일
  • 파일을 모니터링 할 수 QFileSystemWatcher을 사용하고 파이썬 3.4 PySide와 기본 GUI를 쓰고 있어요 : 여기

    상황의 빠른 요약 한 것입니다 QFileSystemWatcher가 메서드를 호출하면 PySide 클래스 내의 메서드가 호출됩니다.
  • PySide 클래스 메서드에 설명 된 GUI 관련 작업이 실행되고 있지 않다는 것을 제외하고는 위의 모든 작업이 완벽하게 작동하는 것처럼 보입니다. 자세한 내용은 아래에서 설명합니다).

예제 코드 : 제가 위에서 언급 한 바와 같이

#Establishing the PySide GUI Class 
class GUI(QMainWindow, Ui_GUI): 
    def __init__(self, parent=None) 
     super(GUI, self).__init__(parent) 
     self.setupUi(self) 

     QtCore.QObject.connect(self.Button, QtCore.SIGNAL("clicked()"), self.Run) 

    def Run(self): 
     print("1") 

     self.treeWidget1.clear() 
     self.treeWidget2.clear() 

     print("2") 

     self.label1.setText("Text 1") 
     self.label2.setText("Text 2") 

     print("3") 

     for y in range(0, 5): 
      self.treeWidget1.resizeColumnsToContents() 

     print("Finished") 

#Establish the file monitoring mechanism, *outside* the PySide class 
def FileChanged(): 
    Script = GUI() 
    Script.Run() 

Paths = ['path/to/file'] 
Watch = QtCore.QFileSystemWatcher(Paths) 
Watch.fileChanged.connect(FileChanged) 

#Setting up the GUI 
if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    showGUI = GUI() 
    showGUI.show() 
    app.exec_() 

, 위의 코드는 오류를 반환하지 않습니다. (경로에 나열된) 파일을 변경하면 FileChanged는 실제로 GUI 클래스에서 Run() 메서드를 호출합니다. 그러나 실제로는 을 수행하지 않고 'stuff'중 하나를으로 처리합니다. 'stuff'사이에서만 인쇄 명령을 실행합니다.

GUI의 '버튼'을 클릭하면 Run()이 올바르게 실행되고 모든 'stuff'가 올바르게 실행됩니다.

내 질문 : 여기에 뭔가 빠졌습니까? 메소드를 올바르게 호출하고 다양한 'print'명령을 실행할 수 있다면, 실제 'stuff'를 실행하지 않는 이유는 무엇입니까?

감사합니다.

편집 1 : 나는 do-stuff-tags를 제거하고 몇 가지 예제 코드를 넣었습니다. 모든 'stuff'코드는 다양한 PySide QLabels, QTreeWidgets 등을 업데이트하는 것과 관련이 있습니다.

EDIT 2 : treeWidget clear 명령 끝에()를 잊어 버립니다.

+0

1, 2 및 3을 인쇄하지만 물건을 수행하지 않으면 물건의 상태를 보여줘야합니다. 그들이 탓할 가능성이 가장 큽니다. – 101

+0

그 정도면 충분하지만 작동하지 않는다면 오류가 발생했을 것입니다. 적어도 실행을 멈추게하여 다음 '인쇄'를 인쇄하지 못하게 할 수 있습니까? 모든 'stuff'명령은 QTreeWidgets 지우기, QLabel 채우기 등과 관련됩니다. – jars121

+0

완전히 해당 코드에 따라 다릅니다. 예외를 발생시키지 않고 원하는 코드를 쉽게 할 수 있습니다! – 101

답변

1

FileChanged 함수에서 생성 된 Script 개체는 로컬 범위를 가지며 함수가 반환 되 자마자 가비지 수집됩니다.

신호가 울릴 때 Run 슬롯이 호출되면 올바르게 변경되지만 아무런 변경 사항도 표시되지 않습니다. Script이 표시되기 전에 삭제되므로이 변경 사항을 볼 수 없습니다. 예제 스크립트는 말이 시작하기에 위해

,이 같은 일에 다시 배치 될 필요가있을 것이다 :

물론
#Setting up the GUI 
if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 

    showGUI = GUI() 

    #Establish the file monitoring mechanism, *outside* the PySide class 
    def FileChanged(): 
     showGUI.Run() 

    Paths = ['path/to/file'] 
    Watch = QtCore.QFileSystemWatcher(Paths) 
    Watch.fileChanged.connect(FileChanged) 

    showGUI.show() 

    app.exec_() 

, 그것은 당신의 실제 코드가있을 가능성이 귀하의 질문에있는 예제 (실행되는 것을 막는 다른 많은 오류가 있음)와 같은 것은 없으므로 도움이되지 않을 수 있습니다. 그러나 그러한 경우에, 당신은 당신이 가지고있는 문제들을 적절하게 보여주는 완전히 독립적 인 예제를 게시해야 할 것입니다.

+0

당신은 신사이고 학자입니다! 게시 한 모든 내용이 완벽합니다. 위의 지침에 따라 GUI 설정을 다시 작성 했으므로 필요에 따라 GUI가 업데이트됩니다. 정말 고마워! – jars121

관련 문제