Python 随着插件的重新打开,函数被调用的次数越来越多

Python 随着插件的重新打开,函数被调用的次数越来越多,python,qt,pyqt,qgis,Python,Qt,Pyqt,Qgis,我有一个用Python2.7.3编写的QGIS插件,其中包含PyQt4.9.1、Qt4.8.1。当我运行这个插件时,每个函数都工作得很好。但当我关闭窗口并再次打开它时,每个函数都会发生两次。然后我再次关闭/打开,它运行了3次,以此类推 我应该在哪里查找错误?我的def run(self)部件看起来就像这样: def run(self): self.dlg.show() self.availableLayers() self.dlg.pushButton_2.clic

我有一个用Python2.7.3编写的QGIS插件,其中包含PyQt4.9.1、Qt4.8.1。当我运行这个插件时,每个函数都工作得很好。但当我关闭窗口并再次打开它时,每个函数都会发生两次。然后我再次关闭/打开,它运行了3次,以此类推

我应该在哪里查找错误?我的
def run(self)
部件看起来就像这样:

def run(self):

    self.dlg.show()

    self.availableLayers()

    self.dlg.pushButton_2.clicked.connect(self.openFile)

    self.dlg.pushButton.clicked.connect(self.groupBy)

    self.dlg.toolButton_4.clicked.connect(self.toggleRightPanel)
如果我通过单击“插件生成器”中的按钮重新加载插件,它将从一开始重新启动


我还应该提到,我不希望丢失用户创建的视图(插件是一个表查看器),而是能够关闭窗口,打开它,然后在不清除单元格的情况下再次打开它。

每次调用
connect
,它都会添加另一个连接,即使它位于同一插槽中。因此,您需要将连接移出
run()
方法,并将其放入对话框的设置方法中,以便只创建一次连接。

每次调用
connect
,它都会添加另一个连接,即使连接到同一插槽。因此,您需要将连接移出
run()
方法,并将它们放入对话框的设置方法中,以便它们只创建一次。

您可能会在每次调用
run
connect
。你可以修理。您可以通过将
Qt.UniqueConnection
传递到
connect
来解决此问题,例如:
self.dlg.button_2.clicked.connect(self.openFile,Qt.UniqueConnection)
。这似乎是一个相当糟糕的设计,您可能应该将您的信号和插槽连接到其他地方,但您提供的代码无法帮助您。self.availableLayers每次都会被调用,它应该被调用,但我认为其余的函数只有在按下按钮时才能执行?这不是点击连接的工作方式吗?@adamczi。嗯,你似乎已经为自己证实了这不是它的工作原理。每次调用
connect
,它都会添加另一个连接,就这么简单。显然,您需要在对话框的设置方法中进行一次连接,而不是在
run
方法中进行一次连接。非常感谢您,将这些函数调用移动到设置方法会有所帮助。如果你把它作为一个答案发布,我很乐意接受。你可能每次调用
run
时都会连接
connect
。你可以修理。您可以通过将
Qt.UniqueConnection
传递到
connect
来解决此问题,例如:
self.dlg.button_2.clicked.connect(self.openFile,Qt.UniqueConnection)
。这似乎是一个相当糟糕的设计,您可能应该将您的信号和插槽连接到其他地方,但您提供的代码无法帮助您。self.availableLayers每次都会被调用,它应该被调用,但我认为其余的函数只有在按下按钮时才能执行?这不是点击连接的工作方式吗?@adamczi。嗯,你似乎已经为自己证实了这不是它的工作原理。每次调用
connect
,它都会添加另一个连接,就这么简单。显然,您需要在对话框的设置方法中进行一次连接,而不是在
run
方法中进行一次连接。非常感谢您,将这些函数调用移动到设置方法会有所帮助。如果你把它作为一个答案,我很乐意接受。谢谢!我一定是误解了
连接
。谢谢!我一定是误解了
连接