在Python/PySide中调用类方法

在Python/PySide中调用类方法,python,pyside,qfilesystemwatcher,Python,Pyside,Qfilesystemwatcher,我花了比我愿意承认的时间更长的时间来思考一个适合这个主题的“问题”,因为我的问题有点难以表达 以下是情况的简要总结: 我正在用Python3.4和PySide编写一个基本的GUI 我正在使用QFileSystemWatcher监视特定文件 当文件更改时,QFileSystemWatcher调用一个方法,该方法反过来调用PySide类中的一个方法 除了PySide类方法中详述的GUI特定操作没有被执行之外,上述所有操作似乎都工作得很好(我将在下面更详细地解释) 示例代码: #Establish

我花了比我愿意承认的时间更长的时间来思考一个适合这个主题的“问题”,因为我的问题有点难以表达

以下是情况的简要总结:

  • 我正在用Python3.4和PySide编写一个基本的GUI
  • 我正在使用QFileSystemWatcher监视特定文件
  • 当文件更改时,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(),并正确执行所有“东西”

我的问题是:这里有我遗漏的东西吗?如果它正确地调用了方法,并且能够执行各种“print”命令,那么为什么它不执行实际的“stuff”

谢谢

编辑1:我删除了-do-stuff-tag,并加入了一些示例代码。所有“stuff”代码都与更新各种PySide Qlabel、QTreeWidgets等相关


编辑2:我忘记了treeWidget clear命令末尾的()

如果在信号触发时调用
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_()

当然,您的真实代码可能与您问题中的示例完全不同(该示例有许多其他错误阻止它运行),因此这可能没有帮助。但如果是这种情况,您必须发布一个完整的、自包含的示例,正确地演示您遇到的问题。

如果它打印1、2和3,但不执行任何内容,那么您需要显示这些内容是什么。这很可能是他们的错。这很公平,但如果他们不工作,肯定会出现错误?至少,它会停止执行,从而阻止它打印以下“打印”?所有的“stuff”命令都与清除qtreewidget、填充qlabel等相关。这完全取决于代码。如果不引发异常,代码可以很容易地不满足您的需要!说得好!不幸的是,我当前的IDE没有调试器,所以我无法单步执行,但我已经用一些示例代码更新了原始帖子。我还将FileChanged调用重新定向到一个Test()方法,只使用了一个命令(清除QTreeWidget),但仍然不起作用。
self.treeWidget1.clear
最后需要
()
,否则我怀疑它不会起作用
self.label1.setText(“Text 1”)
应该可以工作,只要
self.label1
存在并且是
标签
,您可以通过执行
print self.label1
检查它是否打印出
。您是一位绅士和学者!你贴的每件事都很有意义。我已经重新编写了GUI设置(按照上面的说明),现在GUI会根据需要进行更新。非常感谢!