【问题标题】:How to set push-button to keyboard interrupt in PyQt如何在 PyQt 中将按钮设置为键盘中断
【发布时间】:2014-04-12 07:17:17
【问题描述】:

通过终端运行程序时,我们可以通过按 'Ctrl+c' 停止程序,它会显示消息为 'KeyboardInterrupt' 。那么,有没有什么办法可以通过点击 PyQt 中的按钮来做到这一点。

【问题讨论】:

  • 为什么要在单击按钮时引发KeyboardInterrupt 错误?还是您的意思是您只想退出程序:即button.clicked.connect(QtGui.qApp.quit)
  • 但事情是,我正在为 ADC 编写程序,而 ADC 在“while True:”循环下开始读取,然后我无法停止它。替代选项是中断键盘。当我的程序以 root 身份运行时,有什么方法可以停止程序。
  • 始终在您的问题中包含类似的信息,因为它使问题非常更容易理解。无论如何,我在下面给出了一个答案,应该可以解决您的问题。

标签: python pyqt qpushbutton keyboardinterrupt


【解决方案1】:

如果您的程序正在循环运行,您可以定期调用processEvents 以允许 gui 有时间更新(这应该允许您单击一个按钮来关闭应用程序):

    count = 0
    while True:
         count += 1
         if not count % 50:
             QtGui.qApp.processEvents()
         # do stuff...

【讨论】:

  • 我已经发布了与上述相关的另一个问题,请提出建议。问题链接是:stackoverflow.com/questions/23057031/…。我在应用您上面给出的答案后发布了这个,但它没有用,我不知道出了什么问题。
【解决方案2】:

在我中断无限循环的脚本中,我还使用了QtGui.qApp.processEvents(),效果很好。无限循环从串行端口写入和读取数据,用户可以通过按钮(1.condition)中断循环。

def Move_Right(self):

    # move the slide right
    cmdPack = struct.pack(cmdStruct, Address, Rotate_Right, 0, Motor5, Speed5)
    dataByte = bytearray(cmdPack)
    checksumInt = sum(dataByte[:]) % 256
    msgPack = struct.pack(msgStruct, Address, Rotate_Right, 0, Motor5, Speed5, checksumInt)
    ser0.flushOutput() # Clear output buffer
    ser0.write(msgPack)

    # read the switch status
    cmdPack = struct.pack(cmdStruct, Address, Command.GAP, 10, Motor5, 0)
    dataByte = bytearray(cmdPack)
    checksumInt = sum(dataByte[:]) % 256
    msgPack = struct.pack(msgStruct, Address, Command.GAP, 10, Motor5, 0, checksumInt)
    ser0.flushOutput() # Clear output buffer

    # check the switch status with an infinite write/read loop with two break out conditions
    while True: 
        QtGui.qApp.processEvents()  # 1. condition: interrupt with push button
        ser0.write(msgPack)
        reply = ser0.read(9)
        answer = struct.unpack('>BBBBlB', reply)
        value = answer[4]
        command = answer[3]
        if (command == 6) and (value == 1):     # 2. condition: interrupt with limit switch
            print 'end of line'
            Stop_Motor5()
            break

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2023-03-21
    相关资源
    最近更新 更多