Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单击一个按钮可多次发射信号,而不是一次_Python_Pyside - Fatal编程技术网

Python 单击一个按钮可多次发射信号,而不是一次

Python 单击一个按钮可多次发射信号,而不是一次,python,pyside,Python,Pyside,我正在使用pyside和sqlalchemy作为联系信息数据库 sqlalchemy的设置非常标准,除了使用sessionmaker()创建会话时,我设置了expire\on\u commit=False 为了能够在一次会议中创建一个新的会话,我使用了一种刷新按钮。问题是每次我使用“刷新”按钮时,当我尝试添加新行/条目时,我会得到2或4个额外条目(只需单击一次),而如果其中一个被删除,所有“副本”也会被删除(但它们不是实际副本,因为每个副本都有自己的唯一id) (还有一些额外的初始化,但它们在这

我正在使用pyside和sqlalchemy作为联系信息数据库

sqlalchemy的设置非常标准,除了使用sessionmaker()创建会话时,我设置了
expire\on\u commit=False

为了能够在一次会议中创建一个新的会话,我使用了一种刷新按钮。问题是每次我使用“刷新”按钮时,当我尝试添加新行/条目时,我会得到2或4个额外条目(只需单击一次),而如果其中一个被删除,所有“副本”也会被删除(但它们不是实际副本,因为每个副本都有自己的唯一id)

(还有一些额外的初始化,但它们在这里并不重要,因为它们只初始化一些小部件)

以上所有功能都在其他地方使用,例如GUI的第一次初始化,因此这里不起作用的是这些方法的组合。据我所知,是
connectSignals()
方法造成了所有的麻烦。信号显然是加倍的(有时是四倍的),这导致一次点击就有几个条目(代码的执行)


是什么原因导致这种情况,我如何避免这种情况?

如果您多次呼叫a
connect
,您的信号将多次连接到同一插槽。一个信号将触发对插槽的多个调用。我想这就是为什么你的数据库中有多个条目

作为一个简单的示例,每次单击按钮时,下面的代码将打印两个“1”:

self.button=QtGui.QPushButton("my button")
self.button.clicked.connect(self.on_click)
self.button.clicked.connect(self.on_click)
def on_click(self):
    print("1")

当物体被破坏时,信号会自动断开。在您的情况下,您可以销毁self.session来创建一个新会话。因此,所有与self.session直接相关的信号都应该被销毁

但是如果你有这样的东西:

class myWidget(QtGui.QWidget):
    def __init__( self, parent=None):
        super(myWidget, self ).__init__( parent )
        self.button=QtGui.QPushButton("add entry")
        self.button.clicked.connect(self.on_click)

    def on_click(self):
        self.session.add_an_entry()
然后,销毁
self.session
不会断开按钮与单击功能上的
之间的信号。

因此,您可以不多次调用此类
connect
,也可以使用
disconnect
手动删除连接如果多次调用
connect
,您的信号将多次连接到同一插槽。一个信号将触发对插槽的多个调用。我想这就是为什么你的数据库中有多个条目

作为一个简单的示例,每次单击按钮时,下面的代码将打印两个“1”:

self.button=QtGui.QPushButton("my button")
self.button.clicked.connect(self.on_click)
self.button.clicked.connect(self.on_click)
def on_click(self):
    print("1")

当物体被破坏时,信号会自动断开。在您的情况下,您可以销毁self.session来创建一个新会话。因此,所有与self.session直接相关的信号都应该被销毁

但是如果你有这样的东西:

class myWidget(QtGui.QWidget):
    def __init__( self, parent=None):
        super(myWidget, self ).__init__( parent )
        self.button=QtGui.QPushButton("add entry")
        self.button.clicked.connect(self.on_click)

    def on_click(self):
        self.session.add_an_entry()
然后,销毁
self.session
不会断开按钮与单击功能上的
之间的信号。
因此,您不能多次调用此类
connect
,也可以使用
disconnect
手动删除连接