在 Python/PySide 中调用类方法



我花了比我愿意承认的时间更长的时间,我想出了一个合适的"问题"标题来回答这个话题,因为我的问题有点难以表达。

以下是情况的快速摘要:

  • 我正在使用Python 3.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(( 方法。但是,它实际上不会执行任何"内容",它只会在"内容"之间执行打印命令。

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

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

谢谢!

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

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

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_()

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

最新更新