В моем коде есть две кнопки, когда функция ниже запускает таймер и отключает другую кнопку. Теперь, чтобы вкратце разобрать, что происходит: нажимается кнопка OuterSwitch, которая проверяет, закрыта ли внутренняя дверь, а затем открывает внешнюю. При повторном нажатии кнопки OuterSwitch теперь отключается кнопка внутреннего переключателя и блокируется внешняя дверца. Это также запускает таймер на 3 секунды. Теперь, если я нажму внешний переключатель, чтобы открыть внешнюю дверь в это время, я бы хотел, чтобы он остановил таймер и сбросил его, чтобы, когда я снова нажимаю, чтобы закрыть дверь, он запускался с 3 секунд. В настоящее время, когда я снова закрываю дверь, она просто запускает несколько таймеров параллельно. Я безуспешно пытался, надеясь, что кто-нибудь подскажет, как я могу это сделать? Надеюсь, это имеет смысл, если требуется дополнительная информация, спрашивайте.

import sys
import board
import RPi.GPIO as GPIO
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPixmap, QColor, QPalette
from PyQt5.QtWidgets import QApplication
import time
from functools import partial
from threading import Thread


Outer = 22
Inner = 27
GPIO.setup(Outer,GPIO.OUT)
GPIO.setup(Inner,GPIO.OUT)
GPIO.output(Outer,GPIO.HIGH)
GPIO.output(Inner,GPIO.HIGH)




class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.Timer = QtWidgets.QLCDNumber(self.centralwidget)
        self.Timer.setObjectName("Timer")
        self.horizontalLayout.addWidget(self.Timer)
        self.OuterSwitch = QtWidgets.QPushButton(self.centralwidget)
        self.OuterSwitch.setObjectName("OuterSwitch")
        self.horizontalLayout.addWidget(self.OuterSwitch)
        self.InnerSwitch = QtWidgets.QPushButton(self.centralwidget)
        self.InnerSwitch.setObjectName("InnerSwitch")
        self.horizontalLayout.addWidget(self.InnerSwitch)
        self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)




    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.OuterSwitch.setText(_translate("MainWindow", "Open Outer Door"))
        self.InnerSwitch.setText(_translate("MainWindow", "Open Inner Door"))





class ControlMainWindow(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super(ControlMainWindow,self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.OuterSwitch.clicked.connect(self.OuterControl)
        self.ui.InnerSwitch.clicked.connect(self.InnerControl)


    def OuterControl(self):
        if GPIO.input(Inner)==0: #InnerDoorOpen
            return GPIO.output(Outer,GPIO.HIGH),print("Please Close Inner Door")
        elif GPIO.input(Outer) ==1: #Outer Door Close
            self.ui.OuterSwitch.setText(QtWidgets.QApplication.translate("MainWindow", "Close Outer Door",None))
            QtWidgets.QApplication.processEvents()
            return GPIO.output(Outer,GPIO.LOW) #Open Outer Door
        elif GPIO.input(Outer) == 0: #OuterDoor Open
            self.ui.InnerSwitch.setEnabled(False)
            self.ui.OuterSwitch.setText(QtWidgets.QApplication.translate("MainWindow", "Open Outer Door",None))
            QtWidgets.QApplication.processEvents()

            QtCore.QTimer.singleShot(3000,partial(self.ui.InnerSwitch.setEnabled,True))
            return GPIO.output(Outer,GPIO.HIGH) #Close OuterDoor




    def  InnerControl(self):
        if GPIO.input(Outer)==0: #Outer Open
            return GPIO.output(Inner,GPIO.HIGH), print("Please Close Outer Door")
        elif GPIO.input(Inner) ==1: #Inner Door Close
            self.ui.InnerSwitch.setText(QtWidgets.QApplication.translate("MainWindow", "Close Inner Door",None))
            QtWidgets.QApplication.processEvents()
            return GPIO.output(Inner,GPIO.LOW) #Open Inner
        elif GPIO.input(Inner) ==0:
            self.ui.InnerSwitch.setText(QtWidgets.QApplication.translate("MainWindow", "Open Inner Door",None))
            QtWidgets.QApplication.processEvents()
            return GPIO.output(Inner,GPIO.HIGH) #Close Inner





        #Troubleshoot-comment in
##    sys.excepthook=sys.excepthook
##    def exception_hook(exctype,value,traceback):
##        print(exctype,value,traceback)
##        sys.exit(1)
##    sys.excepthook=exception_hook




if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mySW = ControlMainWindow()
    mySW.show()
    sys.exit(app.exec_())
    MainWindow.show()
    sys.exit(app.exec_())

Это часть кода, который управляет входной дверью.

def OuterControl(self):
        if GPIO.input(Inner)==0: #InnerDoorOpen
            return GPIO.output(Outer,GPIO.HIGH),print("Please Close Inner Door")
        elif GPIO.input(Outer) ==1: #Outer Door Close
            self.ui.OuterSwitch.setText(QtWidgets.QApplication.translate("MainWindow", "Close Outer Door",None))
            QtWidgets.QApplication.processEvents()
            return GPIO.output(Outer,GPIO.LOW) #Open Outer Door
        elif GPIO.input(Outer) == 0: #OuterDoor Open
            self.ui.InnerSwitch.setEnabled(False)
            self.ui.OuterSwitch.setText(QtWidgets.QApplication.translate("MainWindow", "Open Outer Door",None))
            QtWidgets.QApplication.processEvents()

            QtCore.QTimer.singleShot(3000,partial(self.ui.InnerSwitch.setEnabled,True))
            return GPIO.output(Outer,GPIO.HIGH) #Close OuterDoor
0
Almaas Shah 25 Сен 2018 в 13:51

2 ответа

Лучший ответ

Мне удалось решить эту проблему: я создал отдельный таймер, который можно отключить, и установил его на одиночный выстрел. Затем я установил вызываемую функцию, которая позволила бы установить внутренний переключатель как истинный / активный. Только если таймер истек ... см. Прикрепленный код:

class ControlMainWindow(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super(ControlMainWindow,self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.OuterSwitch.clicked.connect(self.OuterControl)
        self.ui.InnerSwitch.clicked.connect(self.InnerControl)

        self.current_timer = None

    def starttimer(self):
        if self.current_timer:
            self.current_timer.stop()
            self.current_timer.deleteLater()
        self.current_timer=QtCore.QTimer()
        self.current_timer.setSingleShot(True)
        self.current_timer.start(3000)
        self.current_timer.timeout.connect(self.InnerSwitchOn)

    def InnerSwitchOn(self):   
        self.ui.InnerSwitch.setEnabled(True)

    def OuterControl(self):
        if GPIO.input(Inner)==0: #InnerDoorOpen
            return GPIO.output(Outer,GPIO.HIGH),print("Please Close Inner Door")
        elif GPIO.input(Outer) ==1: #Outer Door Close
            self.ui.OuterSwitch.setText(QtWidgets.QApplication.translate("MainWindow", "Close Outer Door",None))
            QtWidgets.QApplication.processEvents()
            return GPIO.output(Outer,GPIO.LOW) #Open Outer Door
        elif GPIO.input(Outer) == 0: #OuterDoor Open
            self.ui.InnerSwitch.setEnabled(False)
            self.ui.OuterSwitch.setText(QtWidgets.QApplication.translate("MainWindow", "Open Outer Door",None))
            QtWidgets.QApplication.processEvents()
            self.starttimer()
            return GPIO.output(Outer,GPIO.HIGH) #Close OuterDoor
0
Almaas Shah 26 Сен 2018 в 09:26

Попробуйте класс QTimeLine предоставляет временную шкалу для управления анимацией.

import sys
from PyQt5.QtCore    import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui     import *

class Window(QWidget):
    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.resize(400, 230)
        self.setWindowTitle("QTimer.singleShot vs. QTimeLine")

        layV = QVBoxLayout()
        self.setLayout(layV)
        self.lcd = QLCDNumber()  
        self.i = 0        
        layH = QHBoxLayout()
        self.lblSingleShot = QLabel("QTimer.singleShot")
        self.lblSingleShot.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.lblTimeLine   = QLabel("QTimeLine")
        self.lblTimeLine.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        layH.addWidget(self.lblSingleShot)
        layH.addWidget(self.lblTimeLine)

        self.btnStart = QPushButton("Start Timer", clicked=self.startTimer)

        layV.addWidget(self.lcd)
        layV.addLayout(layH)
        layV.addWidget(self.btnStart)

        self.timer = QTimer()  
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.updateData)        

        self.timeLine = QTimeLine(3000)                       # <---
        self.timeLine.setFrameRange(0, 2)  
        self.timeLine.setUpdateInterval(1000)
        self.timeLine.finished.connect(self.finishTimeLine)   # <---

    def finishTimeLine(self):                                 # <---
        self.lblTimeLine.setStyleSheet("background-color: green; color: white;") 

    def startTimer(self):
        if self.btnStart.text() == "Start Timer":
            self.i = 1
            self.lcd.display(self.i)
            self.timer.start(1000) 
            self.btnStart.setText("Stop Timer")
            QTimer.singleShot(3000, self.onShow)
            self.lblSingleShot.setStyleSheet("background-color: white; color: black;")
            self.lblSingleShot.setText("QTimer.singleShot")
            self.lblTimeLine.setStyleSheet("background-color: white; color: black;")
            self.lblTimeLine.setText("QTimeLine")

            self.timeLine.start()                             # <---
        else:
            self.btnStart.setText("Start Timer")
            self.timer.stop()
            self.timeLine.stop()                              # <---
            self.lblTimeLine.setStyleSheet("background-color: red; color: white;")
            self.lblTimeLine.setText("QTimeLine - Stop")
        self.i = 1            

    def updateData(self):
        self.i += 1
        self.lcd.display(self.i)

    def onShow(self):
        self.lblSingleShot.setStyleSheet("background-color: green; color: white;")    
        self.lblSingleShot.setText("<b>def onShow() - Start.")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex  = Window()
    ex.show()
    sys.exit(app.exec_())   

enter image description here

enter image description here

0
S. Nick 26 Сен 2018 в 01:57