我如何让按钮执行直到我释放它?

How do i make a button to execute untill i release it?

在 PyQt4 中,当我按下按钮直到松开按钮时,我遇到了让按钮连续执行的问题。

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Form(QDialog):
   def __init__(self, parent=None):
      super(Form, self).__init__(parent)

      layout = QVBoxLayout()
      self.pushButton = QPushButton("Button1")
      self.pushButton.setCheckable(True)
      self.pushButton.toggle()
      self.pushButton.clicked.connect(lambda:self.whichbtn(self.b1))
      self.pushButton.clicked.connect(self.btnstate)
      layout.addWidget(self.pushButton)

   def btnstate(self):
      if self.pushButton.isChecked():
         print "button pressed"
      else:
         print "button released"


def main():
   app = QApplication(sys.argv)
   ex = Form()
   ex.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   main()

单击按钮时,它应该连续打印语句而不是打印一次,直到我松开按钮。

一种方法是使用 Processes,您 运行 通过创建 Process 在其他进程中的作业。然后你使用 .terminate().

停止它

此外,在您的原始代码中您错过了 self.setLayout(layout),如果不添加布局,您应该看不到 QDialog 中的任何内容。

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from multiprocessing import Process
from time import sleep


class Form(QDialog):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.process = None

        layout = QVBoxLayout()
        self.pushButton = QPushButton("Start/Stop")
        self.pushButton.setCheckable(True)
        self.pushButton.clicked.connect(self.btnstate)
        layout.addWidget(self.pushButton)
        self.setLayout(layout)

    def btnstate(self):
        if self.pushButton.isChecked():
            self.start_execution()    
        else:
            self.stop_execution()

    def do_work(self):
        while True:
            print "Working..."
            sleep(0.5)

    def start_execution(self):
        self.process = Process(target=self.do_work)
        self.process.start()

    def stop_execution(self):
        if self.process is not None:
            self.process.terminate()


def main():
   app = QApplication(sys.argv)
   ex = Form()
   ex.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   main()

尝试使用此功能

self.pushButton.pressed.connect(self.b1)
self.pushButton.released.connect(self.release)

def release(self):
    print("stopped")

def b1(self):
    print("button Clicked")