Как сохранять данные для работы таймера при запуске программы?

В lineEdit пользователь вводит какие-то данные, в dataEdit - дату до кого времени эти данные будут актуальны. После чего пользователь может закрыть программу.

Через некоторое время пользователь войдет в программу и нажмет на кнопку "Проверить срок окончания", после чего если дата истекла появляется уведомление об этом, если нет то, уведомления то время не истекло.

Причем в программе несколько полей dataEdit и lineEdit и изменятся при иссечение времени должна только та строчка, время которой истекло.
Как такое реализовать?

код .ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>640</width>
    <height>480</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <widget class="QGroupBox" name="groupBox">
      <property name="title">
       <string>GroupBox</string>
      </property>
      <layout class="QGridLayout" name="gridLayout_3">
       <item row="1" column="0">
        <spacer name="verticalSpacer">
         <property name="orientation">
          <enum>Qt::Vertical</enum>
         </property>
         <property name="sizeHint" stdset="0">
          <size>
           <width>20</width>
           <height>40</height>
          </size>
         </property>
        </spacer>
       </item>
       <item row="0" column="0">
        <layout class="QGridLayout" name="gridLayout">
         <item row="0" column="1">
          <widget class="QLabel" name="label_2">
           <property name="text">
            <string>Дата окончания</string>
           </property>
          </widget>
         </item>
         <item row="0" column="0">
          <widget class="QLabel" name="label">
           <property name="text">
            <string>Информация</string>
           </property>
          </widget>
         </item>
         <item row="4" column="0">
          <widget class="QLineEdit" name="lineEdit_4"/>
         </item>
         <item row="1" column="1">
          <widget class="QDateEdit" name="dateEdit"/>
         </item>
         <item row="3" column="1">
          <widget class="QDateEdit" name="dateEdit_3">
           <property name="styleSheet">
            <string notr="true">QDateEdit{
Width: 200px;
Heigth: 50px;
}</string>
           </property>
          </widget>
         </item>
         <item row="4" column="1">
          <widget class="QDateEdit" name="dateEdit_4"/>
         </item>
         <item row="2" column="1">
          <widget class="QDateEdit" name="dateEdit_2"/>
         </item>
         <item row="1" column="0">
          <widget class="QLineEdit" name="lineEdit"/>
         </item>
         <item row="2" column="0">
          <widget class="QLineEdit" name="lineEdit_2"/>
         </item>
         <item row="3" column="0">
          <widget class="QLineEdit" name="lineEdit_3"/>
         </item>
        </layout>
       </item>
       <item row="2" column="0">
        <widget class="QPushButton" name="pushButton">
         <property name="text">
          <string>Загрузить данные</string>
         </property>
        </widget>
       </item>
       <item row="3" column="0">
        <widget class="QPushButton" name="pushButton_2">
         <property name="text">
          <string>Проверить срок окончания</string>
         </property>
        </widget>
       </item>
      </layout>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>640</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Ответы (3 шт):

Автор решения: SKISTE

Сохранять timestamp в каком либо файле

>>> from time import time
>>> time()
1631954517.858017

И потом сравнивать с меткой времени, которой тебе нужна

→ Ссылка
Автор решения: Tehnorobot

Вы можете создать базу данных для хранения, изменения и удаления информации, а также для получения данных из базы. Это можно сделать вручную, а можно через python. Например, вы можете воспользоваться библиотеками sqlite3, MySQL и т. д.

Пример записи через sqlite3:

import sqlite3

connection = sqlite3.connect('shows.db')
cursor = connection.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS Shows
              (Title TEXT, Director TEXT, Year INT)''')

connection.commit()
connection.close()

После запуска файла вы увидите, что в вашем текущем каталоге проекта создан один файл с именем shows.db. Это файл базы данных SQLite, созданный Python. Подробнее вы также можете посмотреть здесь

Я же для создания базы данных вручную использую программу sqlitestudio.

→ Ссылка
Автор решения: S. Nick

Класс QSettings обеспечивает постоянные настройки приложения, не зависящие от платформы.

Больше https://doc.qt.io/qt-5/qsettings.html

QSettings - это абстракция этих технологий, позволяющая сохранять и восстанавливать настройки приложения переносимым способом. Он также поддерживает настраиваемые форматы хранения.

Я немного подправил ваш .ui.
Кнопка 'Загрузить данные' вам не нужна, все что нужно будет сохранено по закрытию приложения.

Обратите внимание, чтобы все корректно работало:

1.Все объекты должны иметь objectName.

2.В строке lineEdit и dateEdit имена объектов должны соответствовать следующим правилам:

  • для первой строки 'lineEdit_1' <---> 'dateEdit_1'
  • для второй строки 'lineEdit_2' <---> 'dateEdit_2'
  • и т.д.

main.py

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QSettings, QDateTime, QDate
from PyQt5.uic import loadUi


CONFIG_FILE_NAME = 'config_q1329659.ini'    # !!! сюда будем сохранять                       


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        loadUi("q1329659.ui", self)

        self._date = QDate.currentDate()
        self.listLineEdit = self.findChildren(QtWidgets.QLineEdit)
        self.listDateEdit = self.findChildren(QtWidgets.QDateEdit)

        self.load_settings()
        
        self.pushButton_2.clicked.connect(self.check_date)

    def check_date(self):
        self.x_y()
        listLineEdit = self.findChildren(QtWidgets.QLineEdit)
        _dict = {}
        for lineEdit in listLineEdit:
            obj = lineEdit.objectName()
            if obj[0:9] == 'lineEdit_':
                key = obj[9:]                     #  lineEdit_3 --> '3'      
                _dict[key] = lineEdit.text()
        #print(_dict)    
    
        listDateEdit = self.findChildren(QtWidgets.QDateEdit)
        for dateEdit in listDateEdit:
            if self._date >= dateEdit.date():
                key = dateEdit.objectName()[9:]
                msgBox = QtWidgets.QMessageBox(self)
                msgBox.setWindowTitle("ВНИМАНИЕ")
                msgBox.setIcon(QtWidgets.QMessageBox.Warning)
                msgBox.setText(
                    'Пришло время, делайте что-нибудь!<br>'
                    f'Дата окончания: {dateEdit.date().toString("dd:MM:yyyy")}<br>'
                    f'Информация    : {_dict[key]}<br>'
                )
                msgBox.move(self.x, self.y)
                self.y += 150
                msgBox.show()

    def x_y(self):                                    
        self.x = self.pos().x() + 350
        self.y = self.pos().y()

    def save_settings(self):
        settings = QSettings(CONFIG_FILE_NAME, QSettings.IniFormat)
        settings.setValue('Geometry',    self.saveGeometry())
        settings.setValue('WindowState', self.saveState())

        for lineEdit in self.listLineEdit:
            obj = lineEdit.objectName()
            settings.setValue(obj,  lineEdit.text())

        for dateEdit in self.listDateEdit:
            obj = dateEdit.objectName()
            settings.setValue(obj, dateEdit.date())
            
    def load_settings(self):
        settings = QSettings(CONFIG_FILE_NAME, QSettings.IniFormat)   
        geometry = settings.value('Geometry')
        if geometry:
            self.restoreGeometry(geometry)
        state = settings.value('WindowState')
        if state:
            self.restoreState(state)

        for lineEdit in self.listLineEdit:
            obj = lineEdit.objectName()
            lineEdit.setText(settings.value(obj, ""))
        
        for dateEdit in self.listDateEdit:
            obj = dateEdit.objectName()
            _date = settings.value(obj, QDate.currentDate())
            dateEdit.setDate(_date)

    def closeEvent(self, e):
        self.save_settings()
        super().closeEvent(e)
     

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 10))
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

q1329659.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>350</width>
    <height>464</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <widget class="QGroupBox" name="groupBox">
      <property name="title">
       <string>GroupBox</string>
      </property>
      <layout class="QGridLayout" name="gridLayout_3">
       <item row="0" column="0">
        <layout class="QGridLayout" name="gridLayout">
         <item row="0" column="1">
          <widget class="QLabel" name="label_2">
           <property name="text">
            <string>Дата окончания</string>
           </property>
          </widget>
         </item>
         <item row="0" column="0">
          <widget class="QLabel" name="label">
           <property name="text">
            <string>Информация</string>
           </property>
          </widget>
         </item>
         <item row="4" column="0">
          <widget class="QLineEdit" name="lineEdit_4"/>
         </item>
         <item row="1" column="1">
          <widget class="QDateEdit" name="dateEdit_1">
           <property name="maximumSize">
            <size>
             <width>100</width>
             <height>16777215</height>
            </size>
           </property>
          </widget>
         </item>
         <item row="3" column="1">
          <widget class="QDateEdit" name="dateEdit_3">
           <property name="maximumSize">
            <size>
             <width>100</width>
             <height>16777215</height>
            </size>
           </property>
           <property name="styleSheet">
            <string notr="true"/>
           </property>
          </widget>
         </item>
         <item row="4" column="1">
          <widget class="QDateEdit" name="dateEdit_4">
           <property name="maximumSize">
            <size>
             <width>100</width>
             <height>16777215</height>
            </size>
           </property>
          </widget>
         </item>
         <item row="2" column="1">
          <widget class="QDateEdit" name="dateEdit_2">
           <property name="maximumSize">
            <size>
             <width>100</width>
             <height>16777215</height>
            </size>
           </property>
          </widget>
         </item>
         <item row="1" column="0">
          <widget class="QLineEdit" name="lineEdit_1"/>
         </item>
         <item row="2" column="0">
          <widget class="QLineEdit" name="lineEdit_2"/>
         </item>
         <item row="3" column="0">
          <widget class="QLineEdit" name="lineEdit_3"/>
         </item>
        </layout>
       </item>
       <item row="1" column="0">
        <spacer name="verticalSpacer">
         <property name="orientation">
          <enum>Qt::Vertical</enum>
         </property>
         <property name="sizeHint" stdset="0">
          <size>
           <width>20</width>
           <height>40</height>
          </size>
         </property>
        </spacer>
       </item>
       <item row="2" column="0">
        <widget class="QPushButton" name="pushButton_2">
         <property name="text">
          <string>Проверить срок окончания</string>
         </property>
        </widget>
       </item>
      </layout>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>350</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

введите сюда описание изображения

→ Ссылка