按下按钮PyQt5时重复调用函数

时间:2017-12-11 21:48:05

标签: python-3.x pyqt5

我开始使用这样的代码将函数连接到GUI按钮。

    def on_click():
        call_other_funct()
        time.sleep(1)
    button = QPushButton('Do the thing', self)
    button.pressed.connect(on_click)

问题是我需要在鼠标按下按钮的过程中每秒重复调用on_click()。我搜索了很多但没有找到使用PyQt的解决方案。

我一直在尝试使用计时器间隔来解决这个问题

    def on_release():
        self.timer.stop()

    def on_click():
        self.timer.start(1000)
        self.timer.timeout.connect(on_click())
        print('click')
    button.pressed.connect(on_click)
    button.released.connect(on_release)

这种作品,但由于某种原因,似乎有{指数} on_click()次呼叫正在发生。 (在第一次通话时,“点击”打印一次,然后两次,然后打印4次,然后打印8次等)。有没有办法使这项工作正常,所以每次调用只会再次调用一次?

或者有更好的方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:2)

我怀疑"指数增长"事实上,在事件处理程序on_click中,您在计时器和事件处理程序本身之间创建了一个连接。所以我希望会发生这样的事情:

  • on_click执行一次,计时器连接一次到on_click
  • 一秒钟后,计时器用完并触发on_click。在执行on_click期间,计时器再次连接到on_click
  • 一秒钟后,计时器用完并触发on_click两次(由于2个连接)。然后又生成2个连接。

你应该做的是将你的计时器连接到另一个功能,当鼠标按钮关闭时,它实际上每隔一秒执行你想要执行的操作。

def on_release():
    self.timer.stop()

def on_press():
    self.timer.start(1000)

def every_second_while_pressed():
    print('click')

button.pressed.connect(on_press)
button.released.connect(on_release)
self.timer.timeout.connect(every_second_while_pressed)