我使用pyside和sqlalchemy作为联系人信息的数据库。在
sqlalchemy的设置非常标准,除了当我使用sessionmaker()创建会话时,我设置了expire_on_commit = False
。在
为了能够创建一个新的会话,我使用了一种刷新按钮。问题是每次我使用刷新按钮时,当我尝试添加一个新行/条目时,我会得到2到4个附加条目(只需单击一次),而如果其中一个条目被删除,那么所有的“副本”也会被删除(尽管它们不是实际的副本,因为每个条目都有自己的惟一id)。在
def refresh(self):
self.session.close_all()
self.session = CreateSession(self.username, self.password) #custom method defined elsewhere for creating a session
self.TableViews() #initializing the table views for pyside
self.WidgetsToAttributes() #connect widgets of the gui to the sqlalchemy scheme attributes
self.connectSignals() #connects the qt signals to the appropriate functions in code
pass
(也有一些额外的初始化,但它们在这里无关紧要,因为它们只初始化一些小部件)
上面所有的函数都在其他地方使用,例如在GUI的第一次初始化中,所以这里不起作用的是方法的组合。据我所知,是connectSignals()
方法引起了所有的麻烦。信号显然是加倍的(有时是四倍),这会导致一次点击产生几个条目(代码的执行)。在
是什么原因造成的?我怎样才能避免呢?在
如果您多次调用
connect
,您的信号将多次连接到同一插槽。一个信号将触发对插槽的多个调用。我想这就是为什么你在你的数据库里有多个条目。在作为一个简单的示例,每次单击按钮时,下面的代码将打印两个“1”:
当一个物体被摧毁时,信号会自动断开。在您的例子中,销毁
self.session
来创建一个新的。所以每个直接与self.session
相关的信号都应该被销毁。在但如果你有这样的东西:
^{pr2}$那么销毁
self.session
不会断开按钮和on_click
函数之间的信号。因此,您可以不多次调用这种
connect
,也可以手动删除disconnect
的连接。在相关问题 更多 >
编程相关推荐