diff --git a/oop-exam/date_average.py b/oop-exam/date_average.py new file mode 100644 index 0000000..a47c1b5 --- /dev/null +++ b/oop-exam/date_average.py @@ -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()) \ No newline at end of file