我使用pyside和sqlalchemy作为联系信息数据库。
sqlalchemy的设置非常标准,除了我使用sessionmaker()创建会话时,我设置了expire_on_commit = False
。
为了能够在座位内创建新会话,我使用了一种刷新按钮。问题是每次我使用刷新按钮,当我尝试添加新的行/条目时,我得到2或4个额外的条目(只需点击一下),而如果一个被删除,则所有"副本和#34 ;也被删除(它们不是真正的副本,因为每个副本都有自己唯一的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()
方法。信号显然加倍(有时翻了四倍),从而导致一次点击(执行代码)。
是什么导致这种情况,我该如何避免呢?
答案 0 :(得分:0)
如果您多次拨打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
不会断开按钮和on_click
功能之间的信号。
因此,您可以多次调用此类connect
,也可以手动删除disconnect
的连接。