Как сохранять данные для работы таймера при запуске программы?
В 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 шт):
Сохранять timestamp в каком либо файле
>>> from time import time
>>> time()
1631954517.858017
И потом сравнивать с меткой времени, которой тебе нужна
Вы можете создать базу данных для хранения, изменения и удаления информации, а также для получения данных из базы. Это можно сделать вручную, а можно через 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.
Класс
QSettingsобеспечивает постоянные настройки приложения, не зависящие от платформы.
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>
