【问题标题】:One button click fires signal multiple times instead of once一键点击触发信号多次而不是一次
【发布时间】:2022-01-25 16:22:34
【问题描述】:

我正在使用 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() 方法。信号显然加倍(有时是四倍),这会导致一键输入多个条目(执行代码)。

是什么原因造成的,我该如何避免?

【问题讨论】:

    标签: python pyside


    【解决方案1】:

    如果您多次调用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的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多