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

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

эээмммм. Мы не в клубе. Тут нету юристов и инопланетян, ферштейн?

xwicked
★★★★★★
Последнее исправление: xwicked (всего исправлений: 1)

Windows / Firefox (LT)
Ответ на: комментарий от xwicked

Еще игровую механику тебе придумал. Каждая таблетка либо плющит (-какой-то коэфицент) либо топорщит (+какой-то коэфицент), а задача в минимальное количество таблеток улететь в сириус. После каждой таблетки рандомизировать веса.

Anoxemian
★★★★
Anonymous / Unknown (EE)

Лифт почти готов. https://disk.yandex.ru/d/HLXnyub569K2JQ - полный код.

# ======================================================================
#   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(1000) #Интервал 1 секунда

    bDirectionMove = None # Направление движения
    iFloorN = 1 #текущий этаж
    iFloorNe = 0 #нужный этаж 
    iMaxFloor = 0 #Максимальный этаж, куда нужно будет ехать
    lEnt = []  #массив нажатых этажей
    lLift = [] #массив определяющий откуда была нажата кнопка, с лифта или нет
    bFlagLift = None # Флаг лифта
    bUp = True #Направление движения вверх
    bDown = False #Направление движения вниз

    def moveUp(): # движение вверх
        uiMain.changeFloor()
        wMain.iFloorN+=1
        wMain.bDirectionMove = wMain.bUp

    def moveDown(): # Движение вниз
        uiMain.changeFloor()
        wMain.iFloorN-=1
        wMain.bDirectionMove = wMain.bDown

    def changeFloor(): #Изменение этажа
        button = wMain.findChild(QRadioButton, 'rbFloor' + str(wMain.iFloorN))
        wMain.lPosition.setText(str(wMain.iFloorN))
        button.setChecked(True)

    def openDoors(): #Открытие дверей лифта
        wMain.lPosition.setText("двери открыты")
        wMain.t.singleShot(1000, uiMain.closeDoors)

    def closeDoors(): #Закрытие дверей лифта
        wMain.lPosition.setText("двери закрыты")
        wMain.gbCabin.setEnabled(True)

    def closeCabin(): #Отключение кабины
        wMain.gbCabin.setEnabled(False)       


    def getFloor(): #Получение этажа
        for i in range (len(wMain.lEnt)):
            if wMain.lEnt[i] == True:
                wMain.iFloorNe = i + 1

    def stopLift(): #Остановка лифта
        bTemp = True
        for i in range (len(wMain.lEnt)):
            if wMain.lEnt[i] == True:
                bTemp = False
                break
        if bTemp == True:
            wMain.t.stop()
            uiMain.saveSettings()
            wMain.t.singleShot(10000, uiMain.closeCabin)

    def delFloor(): #Удаление этажа
        wMain.lEnt[wMain.iFloorN -1] = False
        wMain.lLift[wMain.iFloorN-1] = False

    def arrived(): #Приехали
        uiMain.changeFloor()
        uiMain.openDoors()
        uiMain.releaseButton(wMain.iFloorNe)
        uiMain.delFloor()
        uiMain.stopLift()

    def saveSettings(): #Сохранение свойств
        with open("settings.html", "wt") as fFloor:
            print("<html>\n \
	                <head>\n \
	                <title>\n \
		                    Заголовок\n \
	                </title>\n \
	                </head>\n \
	                <body bgcolor=\"purple\">\n \
		                <h1>"+str(wMain.iFloorN)+"</h1>\n \
	                </body>\n \
                    </html>", file=fFloor)  

    def openSettings(): #Загрузка свойств
        with open("settings.html", "rt") as fFloor:
            sText = ""
            sFloor = ""
            for i in range(10):
                if i == 7: 
                    sFloor = fFloor.readline()
                else:    
                    sText = fFloor.readline()
        sText = sFloor[23:24]
        wMain.iFloorN = int(sText)
        uiMain.changeFloor()
        wMain.setWindowTitle(sText)

    def timerLift(): #Движение лифта
        uiMain.getFloor()
        if wMain.iFloorNe == wMain.iFloorN:
            uiMain.arrived()
 #       if wMain.bDirectionMove == wMain.bUp and wMain.lLift[wMain.iFloorNe-1] == False:
 #           wMain.iFloorNe = wMain.iMaxFloor
        if wMain.iFloorNe < wMain.iFloorN:
            wMain.bDirectionMove = wMain.bDown
            uiMain.moveDown()
        if wMain.iFloorNe > wMain.iFloorN:
            wMain.bDirectionMove = wMain.bUp
            uiMain.moveUp()

    t.timeout.connect(timerLift)

    def releaseButton(n): #Отжать нажатые кнопки этажей
        button = wMain.findChild(QPushButton, 'pbEntr' + str(n))
        button.setChecked(False)
        button = wMain.findChild(QPushButton, 'pbLift' + str(n))
        button.setChecked(False)

    def checkMaxFloor(): #Определить максимальный этаж
        for i in range(len(wMain.lEnt)):
            if wMain.lEnt[i] == True:
                wMain.iMaxFloor = i

    def slotEnt(self): #Нажатие на кнопку этажа
        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[iFloor-1] = True
        wMain.lLift[iFloor-1] = flag
        uiMain.checkMaxFloor()
        wMain.t.start()
        
    def slotStop(self): #Нажатие на кнопку остановки лифта
        wMain.t.stop()
        for i in range (10):
           uiMain.releaseButton(i)



wMain = uiMain()
for i in range (9):
    wMain.lEnt.append(False)
    wMain.lLift.append(False)
wMain.show()
uiMain.openSettings()


sys.exit(app.exec())
xwicked
★★★★★★
Windows / Firefox (LV)