【问题标题】:Calling a class method in Python/PySide在 Python/PySide 中调用类方法
【发布时间】:2014-12-03 23:03:06
【问题描述】:

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

这里是情况的快速总结:

  • 我正在使用 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() 方法。但是,它实际上不会执行任何“stuff”,它只会在“stuff”之间执行打印命令。

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

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

谢谢!

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

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

【问题讨论】:

  • 如果它正在打印 1、2 和 3 但没有做任何事情,那么你需要显示这些东西是什么。他们很可能是罪魁祸首。
  • 这很公平,但是如果它们不工作,肯定会引发错误吗?至少,它会停止执行,从而阻止它打印以下“打印”?所有的“东西”命令都与清除 QTreeWidgets、填充 QLabels 等有关。
  • 这完全取决于该代码。如果不引发异常,代码很容易不想要你想要的!
  • 好点!不幸的是,我当前的 IDE 没有调试器,所以我无法逐步完成,但我已经用一些示例代码更新了原始帖子。我还将 FileChanged 调用重定向到 Test() 方法,只使用了一个命令(清除 QTreeWidget),但仍然不起作用。
  • self.treeWidget1.clear 最后需要 () ,否则我怀疑它不会工作。 self.label1.setText("Text 1") 应该可以工作,前提是 self.label1 存在并且是 label,您可以通过执行 print self.label1 来检查它是否打印出 <PySide.QtGui.QLabel object at 0x.......>

标签: python pyside qfilesystemwatcher


【解决方案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_()

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

【讨论】:

  • 你是一位绅士和学者!您发布的所有内容都很有意义。我已经重新编写了 GUI 设置(按照您上面的说明),现在 GUI 会根据需要进行更新。非常感谢!
猜你喜欢
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多