1.电梯上行:只处理上楼事件,若有下楼事件,则记录在downFloorList中,待上楼事件处理完后,再处理下楼事件
2.电梯下行: 与上行反之
# coding=utf-8
import sys
import sys, os
if hasattr(sys, 'frozen'):
os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH']
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Elevator(QWidget):
aimFloor=1
floor = 1 #电梯当前楼层,初试电梯在1楼
prefloor = 1#表示电梯上下初始运行所处的楼层
status = 0 #电梯当前状态:0表示暂停,1表示向上,-1表示向下
preStatus = 1 #电梯前一状态,1表示向上,-1表示向下
door = 1 #0表示打开,1表示关闭
upfloorList = [] #电梯上行楼层
downfloorList = [] #电梯下行楼层
buttonList = []#电梯楼层按钮
floorList=[]
def __init__(self,buttonCount):
super().__init__()
self.initUI(buttonCount)
self.timer2 = QTimer(self) # 初始化一个定时器
self.timer2.timeout.connect(lambda: self.changeFloor()) # 计时结束调用楼层显示方法
self.timer2.start(1500)
def initUI(self,buttonCount):
lay = QGridLayout()
self.lcd2 = QLCDNumber()#说明电梯当前处于楼层
self.label = QLabel("状态")#说明电梯状态即方向
self.label.setStyleSheet("QLabel{color:blue}")
self.lcd2.setSegmentStyle(QLCDNumber.Flat)
self.lcd2.setStyleSheet("border:0.5px solid black; color: red; background: silver;")
self.lcd2.display(1)
lay.addWidget(self.lcd2,0,0,1,1)
lay.addWidget(self.label,0,2,1,2)
for i in range(buttonCount):
button = QPushButton(str(i+1))
button.clicked.connect(self.Cli)
self.buttonList.append(button)
lay.addWidget(button)
self.close_door = QPushButton("关门")
self.open_door = QPushButton("开门")
self.close_door.clicked.connect(self.Close)
self.open_door.clicked.connect(self.Open)
lay.addWidget(self.close_door)
lay.addWidget(self.open_door)
lay.addWidget(button)
self.setLayout(lay)
self.show()
#"QPushButton{color:black}", "QPushButton{background-color:rgb(78,255,255)}"
#电梯内部按钮
def Cli(self):
floor = int(self.sender().text())
if self.floor==floor:
self.Open()
return
elif floor > self.floor and floor not in self.upfloorList :
self.upfloorList.append(floor)
if self.status == 0 and self.preStatus==1:
self.preStatus=1
self.status=1
elif floor < self.floor and floor not in self.downfloorList:
self.downfloorList.append(floor)
if self.status == 0 and self.preStatus==-1:
self.preStatus = -1
self.status = -1
self.sender().setStyleSheet( "QPushButton{background-color:red}")
self.Close()
#当电梯门打开后才执行闭门函数
def Close(self):
if self.door == 0: #=0表示当层楼门打开
self.door = 1 #改变门状态为关闭,门关闭才代表电梯可以走
self.status = self.preStatus
self.label.setText("电梯门关闭")
self.close_door.setStyleSheet("QPushButton{background-color:red}")
self.open_door.setStyleSheet("QPushButton{background-color:None}")
self.runStrategy()
self.timer2.start(1500)#关门开始循环计时
def Open(self):
if self.door==1:
self.door = 0
self.preStatus = self.status
self.status = 0
self.label.setText("电梯门打开")
self.open_door.setStyleSheet("QPushButton{background-color:red}")
self.close_door.setStyleSheet("QPushButton{background-color:None}")
self.timer2.stop() #开门停止循环计时
self.buttonList[self.floor - 1].setStyleSheet("QPushButton{background-color:None}")
#电梯运行策略函数
def runStrategy(self):
if self.status == 1: #电梯上行状态
if len(self.upfloorList)==0 and len(self.downfloorList)!=0: #上行楼层为空,下行楼层不为空
self.status=-1 #改变电梯状态为下行
self.label.setText("电梯下行")
elif len(self.upfloorList)!=0: #如果上行楼层不为空,则电梯继续上行
self.label.setText("电梯上行")
elif self.status == -1: #电梯下行状态
if len(self.downfloorList) == 0 and len(self.upfloorList) != 0: #下行楼层为空,上行楼层不为空
self.status = 1
self.label.setText("电梯上行")
elif len(self.downfloorList)!=0:
self.label.setText("电梯下行")
if len(self.downfloorList)==0 and len(self.upfloorList)==0:
self.status=0
self.label.setText("电梯停滞")
self.timer2.stop() #防止无效循环运行,耗费内存
#楼层显示改变
def changeFloor(self):
self.runStrategy() #先来判断电梯运行状态
print("还在运行")
if self.status == 1 and len(self.upfloorList)!=0 and self.aimFloor!= max(self.upfloorList) :
self.aimFloor=max(self.upfloorList)
self.floorList = []
for i in range(self.floor+1,self.aimFloor+1):
self.floorList.append(i)
elif self.status == -1 and len(self.downfloorList)!=0 and self.aimFloor!= min(self.downfloorList):
self.aimFloor = min(self.downfloorList)
self.floorList = []
for i in range(self.aimFloor , self.floor ):
self.floorList.append(i)
self.floorList.sort(reverse=True)
if self.status!=0:
self.displayFloor()
#楼层显示
def displayFloor(self):
if len(self.floorList)!=0 and self.door==1:
self.floor=self.floorList.pop(0)
self.lcd2.display(self.floor)
if self.status==1 and self.floor in self.upfloorList:
self.upfloorList.remove(self.floor)
self.Open() # 当层楼到了,电梯开门
elif self.status==-1 and self.floor in self.downfloorList:
self.downfloorList.remove(self.floor)
self.Open() # 当层楼到了,电梯开门
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Elevator(10)
app.exit(app.exec_())
这个效果是时间bug修复之前版本,上述代码是bug修复的,应该不存在bug了,如果存在,欢迎大家指出。
ScreenCapture