LINUXTALKS.CO

Программа «лифт» на Python + PyQt6

 , , , ,

L


0

1

Здаровчик! Создаю обучающий проект. Пишем уже пару месяцев. В нём я школьницу обучаю логическому мышлению и python. Всё создаём с нуля. Вот что получилось.

# ======================================================================
#   main.py - Главный файл программы.
#   Является частью программы Project L, распространяемой под
#   Стандартной общественной лицензией, версии 2 (GNU GPL v2).
# ======================================================================
#   Copyleft 2026 by Lab Free Technologies <[email protected]>
# ==============================================================================
#   Copyleft 2026  Лаборатория свободных технологий <[email protected]>
# ==============================================================================
#

# from PyQt6 import QtWidgets, QtCore
from PyQt6.QtCore import QCoreApplication
from PyQt6.QtCore import QDate
from PyQt6.QtCore import QTime
from PyQt6.QtCore import QTimer
from PyQt6.QtWidgets import QApplication
from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QTableWidgetItem
from PyQt6.QtWidgets import QFileDialog
from PyQt6.QtWidgets import QMessageBox
from PyQt6.QtWidgets import QDial
from PyQt6.QtWidgets import QRadioButton
from PyQt6.QtWidgets import QPushButton

import sys
from threading import Timer
import time
import math
import mainwindow_ui

app = QApplication(sys.argv)


class uiMain (QMainWindow, mainwindow_ui.Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self);
    t = QTimer()
    t.setInterval(1500)

    bCabin = False
    bFirstPress = False
    iFloorN = 1 #текущий этаж
    iFloorNe = 0 #нужный этаж 
    lEnt = []  #массив нажатых этажей
    lLift = [] 
    iCountEnt = 0

    def moveUp():
        uiMain.changeFloor()
        wMain.iFloorN+=1

    def moveDown():
        uiMain.changeFloor()
        wMain.iFloorN-=1

    def changeFloor():
        button = wMain.findChild(QRadioButton, 'rbFloor' + str(wMain.iFloorN))
        button.setChecked(True)

    def currentFloor():
        uiMain.changeFloor()
        wMain.lPosition.setText("двери открыты")
        wMain.t.singleShot(500, uiMain.closeDoors)
        if not wMain.gbCabin.isEnabled():
            wMain.gbCabin.setEnabled(True)
        elif wMain.gbCabin.isEnabled():
            wMain.gbCabin.setEnabled(False)

    def closeDoors():
        wMain.lPosition.setText("двери закрыты")

    def getFloor():
        if len(wMain.lEnt) != 0:
            wMain.iFloorNe = wMain.lEnt[0]

    def stopLift():        
        if len(wMain.lEnt) == 0:
            wMain.t.stop()

    def delFloor():
        wMain.lEnt.pop(0)

    #def cabinEnabled():


    def timerLift():
        uiMain.getFloor()
        if wMain.iFloorNe == wMain.iFloorN:
            uiMain.currentFloor()
            uiMain.releaseButton(wMain.iFloorNe)
            uiMain.delFloor()
            uiMain.stopLift()
            #uiMain.checkCabin()
        if wMain.iFloorNe < wMain.iFloorN:
            uiMain.moveDown()
        if wMain.iFloorNe > wMain.iFloorN:
            uiMain.moveUp()

    t.timeout.connect(timerLift)

    def releaseButton(n):
        button = wMain.findChild(QPushButton, 'pbEntr' + str(n))
        button.setChecked(False)

    def slotEnt(self):
        #if wMain.bFirstPress == False:
        #    wMain.bFirstPress = True
        wMain.setWindowTitle(self.sender().objectName())
        if self.sender().objectName().find("lift") > -1: 
            flag = True
        else:
            flag = False      
        iFloor = int(self.sender().objectName()[6:])
        wMain.lEnt.append(iFloor)
        wMain.lLift.append(flag)
        wMain.t.start()
        
    def slotStop(self):
        wMain.t.stop()
        for i in range (10):
           uiMain.releaseButton(i)



wMain = uiMain()
'''for i in range (9):
    uiMain.iFloors.append(False)'''
wMain.show()


sys.exit(app.exec())

Сейчас лифт едет по всем нажатым кнопкам. Он собирает историю и можно бесконечно тыкать и он будет всё время ехать. Пока не реализовано ехать вверх не собирать никого, а вниз едучи - собирать и останавливаться на каждом этаже. Использую 2 списка - этажи и лифт. При нажатии на кнопку, прога вычисляет кто нажал, этаж или кабина лифта. Дальше логика не написана.
Можете насоветовать как лучше сделать.
https://disk.yandex.ru/d/_4LmCisQd87--A - Полный код.

★★★★★★

Быстрофикс: слово лифт заменить на слово крыша, девятый этаж переименовать в сириус, а заместо кнопок нарисовать таблетки.

Anoxemian
★★★★
Anonymous / Unknown (EE)