Добавить 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