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