1

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

以下是情况的快速摘要:

  • 我正在用 Python 3.4 和 PySide 编写一个基本的 GUI
  • 我正在使用 QFileSystemWatcher 来监视特定文件
  • 当文件更改时,QFileSystemWatcher 调用一个方法,该方法又调用 PySide 类中的一个方法
  • 除了 PySide Class 方法中详述的特定于 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() 方法。但是,它实际上不会做任何“东西”,它只会在“东西”之间执行打印命令。

如果我然后单击 GUI 中的“按钮”,它将正确执行 Run(),并正确执行所有“东西”。

我的问题:我在这里缺少什么吗?如果它正确调用该方法,并且能够执行各种“打印”命令,为什么它不执行实际的“东西”?

谢谢!

编辑 1:我删除了 -do stuff- 标签并放入了一些示例代码。所有“东西”代码都与更新各种 PySide QLabels、QTreeWidgets 等有关。

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

4

1 回答 1

1

Script函数中创建的对象FileChanged具有本地作用域,一旦函数返回,就会被垃圾回收。

如果在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_()

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

于 2014-12-04T01:37:16.963 回答