2014-12-03 87 views
1

我花费的时间比我关心的还要多,因为我的问题有点难以表达。在Python/PySide中调用类方法

这里的形势的快速摘要:

  • 我正在写一个基本的GUI与Python 3.4和PySide
  • 我使用QFileSystemWatcher监视特定文件
  • 当文件QFileSystemWatcher调用一个方法,该方法依次调用一个PySide类中的方法
  • 除了在PySide类方法中详细描述的GUI特定的操作没有被执行之外,上述所有内容看起来都很完美(I下面会更详细地解释)。

示例代码:

#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()方法。但是,它不会实际上的任何'东西',它只会执行'东西'之间的打印命令。

如果我然后点击GUI中的'Button',它将正确执行Run(),并正确执行所有'stuff'。

我的问题:有什么我在这里失踪?如果它正确地调用方法,并且能够执行各种'打印'命令,为什么它不执行实际的'东西'?

谢谢!

编辑1:我已经删除了-do stuff-标签并放入了一些示例代码。所有的'东西'代码涉及更新各种PySide QLabels,QTreeWidgets等。

编辑2:我忘记了()在treeWidget清除命令的末尾。

+0

如果它正在打印1,2和3但没有做任何东西,那么你需要显示东西是什么东西。这很可能是他们应该责备的。 – 101 2014-12-03 23:06:21

+0

这很公平,但如果他们不工作,肯定会引发错误?至少,它会停止执行,从而阻止它打印下面的'打印'?所有'stuff'命令都与清除QTreeWidgets,填充QLabels等有关。 – jars121 2014-12-03 23:16:17

+0

它完全依赖于该代码。代码可以很容易地不需要你想要的,而不会引发异常! – 101 2014-12-03 23:17:23

回答

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 2014-12-04 02:06:06