QPushButton,禁用所有其他按钮,除非再次按下

Posted

技术标签:

【中文标题】QPushButton,禁用所有其他按钮,除非再次按下【英文标题】:QPushButton, to disable all other push buttons unless pressed again 【发布时间】:2018-09-24 08:02:59 【问题描述】:

我有 4 个按钮(打开外部、关闭外部、打开内部、关闭内部),它们控制 2 个门(通过 2 个继电器)、一个内门和一个外门。一次只能打开一扇门,我已经整理了这么多代码,现在问题是当我关闭外门时,我希望它禁用除“打开”外门按钮之外的所有其他按钮.这可能吗?我将在下面粘贴我的代码的相关部分:

 #@QtCore.pyqtSlot()
    def OuterDoorOpen(self):
        if Door2_Channel == 0:
            return GPIO.output(self.Door1,GPIO.HIGH)
        else:
            return "Please Close Inner Door"

    #@QtCore.pyqtSlot()
    def OuterDoorClose(self):
        if Door2_Channel == 1:
            return
                GPIO.output(self.Door2,GPIO.LOW), self.pushButton_2.setEnabled(False),
self.pushButton_3.setEnabled(False),
self.pushButton_4.setEnabled(False)


    #@QtCore.pyqtSlot()
    def InnerDoorOpen(self):
        if Door1_Channel == 0:
            return GPIO.output(self.Door2,GPIO.HIGH)
        else:
            return "Please Close Outer Door"

    #@QtCore.pyqtSlot()
    def InnerDoorClose (self):
        if Door1_Channel == 1:
            return GPIO.output(self.Door2,GPIO.LOW)

我在 python 3.7 上使用 QtDesigner 和我使用 pyqt5 设计了 ​​GUI。我正在使用树莓派控制继电器。每当我运行此代码并按下按钮关闭时,它都会导致程序崩溃。

谢谢

【问题讨论】:

【参考方案1】:

抱歉,如果这个建议听起来很愚蠢,但是如果您在 OuterDoorClose 块中添加 Try except 块并调试您的代码会怎样?它可能会帮助您了解导致程序崩溃的代码行以及原因。例如:

self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.enable_buttons)

#@QtCore.pyqtSlot()
def OuterDoorClose(self):
    try:
        if Door2_Channel == 1:
            self.pushButton_2.setEnabled(False)
            self.pushButton_3.setEnabled(False)
            self.pushButton_4.setEnabled(False)
            self.timer.start(30000)
            return GPIO.output(self.Door2,GPIO.LOW)
    except Exception as e:
        #Your exception code



def self.enable_buttons(self):
    self.pushButton_2.setEnabled(True)
    self.pushButton_3.setEnabled(True)
    self.pushButton_4.setEnabled(True)

【讨论】:

您好@Chaitanya Bangera,我知道问题在于您突出显示的代码部分,因为当它被删除时程序运行完全正常。 好的,你知道异常是什么吗?另外,我想知道是否需要返回 setEnabled 语句?如果在返回值之前禁用按钮,它会起作用吗?我已更改代码以反映我想说的内容。 我没有收到异常消息,我得到“后端终止(返回码:-6)GUI 只是在按下按钮时关闭。我想要的是当点击 pushButton_2 时,为它禁用所有按钮 30 秒,除了 pushButton_1 可以单击以打开门并再次启用所有按钮。我希望这有意义吗? @AlmaasShah 您是从 CMD 或终端执行它还是使用任何 IDE? @eyllanesc 我在 Raspberry Pi 上使用 Thonny 执行它【参考方案2】:

我设法通过使用 partials 并将 SetEnabled 设置为 False 来实现这一点。这是代码的相关部分。

def OuterDoorClose(self):
    if GPIO.input(Outer)==0: #Outer Door Open
        self.ui.pushButton_3.setEnabled(False)
        self.ui.pushButton_4.setEnabled(False)
        QtCore.QTimer.singleShot(10000,partial(self.ui.pushButton_3.setEnabled,True))
        return GPIO.output(Outer,GPIO.HIGH)

【讨论】:

以上是关于QPushButton,禁用所有其他按钮,除非再次按下的主要内容,如果未能解决你的问题,请参考以下文章

除非选中复选框,否则禁用按钮(Angular 7+)?

运行一次查询后按钮禁用

如果复选框选中禁用其他,如果未选中启用所有 JavaScript?

QPushButton 的大小打破了布局高度(MacOS)

QPushButton 更改同一布局中其他小部件的边距

当textfield为空时禁用按钮等待其他文本字段中的任何更改