static-files/oop-exam/date_average.py

95 lines
No EOL
3.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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())