一键点击触发信号多次,而不是打开

2024-09-29 20:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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()方法引起了所有的麻烦。信号显然是加倍的(有时是四倍),这会导致一次点击产生几个条目(代码的执行)。在

是什么原因造成的?我怎样才能避免呢?在


Tags: theto方法self信息数据库forsqlalchemy
1条回答
网友
1楼 · 发布于 2024-09-29 20:25:50

如果您多次调用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相关的信号都应该被销毁。在

但如果你有这样的东西:

^{pr2}$

那么销毁self.session不会断开按钮和on_click函数之间的信号。
因此,您可以不多次调用这种connect,也可以手动删除disconnect的连接。在

相关问题 更多 >

    热门问题