95 lines
No EOL
3.6 KiB
Python
95 lines
No EOL
3.6 KiB
Python
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()) |