Добавить oop-exam/date_average.py
This commit is contained in:
parent
91c8cad074
commit
a6c27529b0
1 changed files with 95 additions and 0 deletions
95
oop-exam/date_average.py
Normal file
95
oop-exam/date_average.py
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
from PyQt6.QtWidgets import (
|
||||||
|
QApplication, QWidget, QVBoxLayout, QHBoxLayout, QListWidget,
|
||||||
|
QPushButton, QLabel, QDateEdit, QListWidgetItem
|
||||||
|
)
|
||||||
|
from PyQt6.QtCore import QDate
|
||||||
|
import sys
|
||||||
|
|
||||||
|
class AverageDateCalculator(QWidget):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.setWindowTitle("Среднее значение дат")
|
||||||
|
self.resize(400, 300)
|
||||||
|
|
||||||
|
self.layout = QVBoxLayout()
|
||||||
|
self.setLayout(self.layout)
|
||||||
|
|
||||||
|
# Список дат
|
||||||
|
self.list_widget = QListWidget()
|
||||||
|
self.list_widget.setSelectionMode(QListWidget.SelectionMode.ExtendedSelection)
|
||||||
|
self.layout.addWidget(self.list_widget)
|
||||||
|
|
||||||
|
# Кнопки для добавления/удаления
|
||||||
|
btn_layout = QHBoxLayout()
|
||||||
|
self.add_btn = QPushButton("Добавить сегодня")
|
||||||
|
self.remove_btn = QPushButton("Удалить выбранные")
|
||||||
|
btn_layout.addWidget(self.add_btn)
|
||||||
|
btn_layout.addWidget(self.remove_btn)
|
||||||
|
self.layout.addLayout(btn_layout)
|
||||||
|
|
||||||
|
# Диапазон дат
|
||||||
|
range_layout = QHBoxLayout()
|
||||||
|
self.start_date = QDateEdit()
|
||||||
|
self.end_date = QDateEdit()
|
||||||
|
self.start_date.setCalendarPopup(True)
|
||||||
|
self.end_date.setCalendarPopup(True)
|
||||||
|
self.start_date.setDate(QDate.currentDate())
|
||||||
|
self.end_date.setDate(QDate.currentDate())
|
||||||
|
range_layout.addWidget(QLabel("С:"))
|
||||||
|
range_layout.addWidget(self.start_date)
|
||||||
|
range_layout.addWidget(QLabel("По:"))
|
||||||
|
range_layout.addWidget(self.end_date)
|
||||||
|
self.layout.addLayout(range_layout)
|
||||||
|
|
||||||
|
# Вывод среднего
|
||||||
|
self.result_label = QLabel("Среднее: —")
|
||||||
|
self.layout.addWidget(self.result_label)
|
||||||
|
|
||||||
|
# Сигналы
|
||||||
|
self.add_btn.clicked.connect(self.add_today)
|
||||||
|
self.remove_btn.clicked.connect(self.remove_selected)
|
||||||
|
self.list_widget.itemSelectionChanged.connect(self.compute_average)
|
||||||
|
self.start_date.dateChanged.connect(self.compute_average)
|
||||||
|
self.end_date.dateChanged.connect(self.compute_average)
|
||||||
|
|
||||||
|
def add_today(self):
|
||||||
|
today = QDate.currentDate()
|
||||||
|
item = QListWidgetItem(today.toString("yyyy-MM-dd"))
|
||||||
|
self.list_widget.addItem(item)
|
||||||
|
self.compute_average()
|
||||||
|
|
||||||
|
def remove_selected(self):
|
||||||
|
for item in self.list_widget.selectedItems():
|
||||||
|
self.list_widget.takeItem(self.list_widget.row(item))
|
||||||
|
self.compute_average()
|
||||||
|
|
||||||
|
def compute_average(self):
|
||||||
|
# Собираем даты
|
||||||
|
selected_items = self.list_widget.selectedItems()
|
||||||
|
if selected_items:
|
||||||
|
dates = [QDate.fromString(item.text(), "yyyy-MM-dd") for item in selected_items]
|
||||||
|
else:
|
||||||
|
# Если ничего не выделено, берем все элементы в диапазоне
|
||||||
|
start = self.start_date.date()
|
||||||
|
end = self.end_date.date()
|
||||||
|
dates = []
|
||||||
|
for i in range(self.list_widget.count()):
|
||||||
|
date = QDate.fromString(self.list_widget.item(i).text(), "yyyy-MM-dd")
|
||||||
|
if start <= date <= end:
|
||||||
|
dates.append(date)
|
||||||
|
|
||||||
|
if not dates:
|
||||||
|
self.result_label.setText("Среднее: —")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Вычисляем среднее
|
||||||
|
days_sum = sum([date.toJulianDay() for date in dates])
|
||||||
|
avg_day = days_sum // len(dates)
|
||||||
|
avg_date = QDate.fromJulianDay(avg_day)
|
||||||
|
self.result_label.setText(f"Среднее: {avg_date.toString('yyyy-MM-dd')}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
window = AverageDateCalculator()
|
||||||
|
window.show()
|
||||||
|
sys.exit(app.exec())
|
||||||
Loading…
Add table
Add a link
Reference in a new issue