2015-08-09 46 views
0

我正在使用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()方法。信号明显增加了一倍(有时翻两番),从而导致一次点击就产生多个条目(执行代码)。

是什么原因导致的,我该如何避免它?

回答

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的连接。