Как запоминать данные между сеансами
Делаю GUI в PyQt5. Стоит задача сделать выпадающее меню с запоминанием данных (что выбрал в первый запуск приложения - выводится в следующие разы).
Выходит исключение:
TypeError index 0 has type 'numpy.float64' but 'str' is expected.
Сам код:
import sys
import numpy as np
from PyQt5.QtWidgets import (QWidget, QLabel,
QComboBox, QApplication)
from PyQt5.QtGui import QIcon
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
items = np.array(["Вариант 1", "Вариант 2",
"Вариант 3", "Вариант 4",
"Вариант 5", "Вариант 6"])
items = np.loadtxt('items.txt')
print(items)
self.lbl = QLabel(self)
combo = QComboBox(self)
combo.addItems(items)
combo.move(50, 50)
self.lbl.move(50, 150)
combo.activated[str].connect(self.onActivated)
self.setGeometry(500, 300, 500, 300)
self.setWindowTitle('KeyVoice')
self.setWindowIcon(QIcon('icon.png'))
self.show()
def onActivated(self, items):
np.savetxt('items.txt', items, fmt='%d')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Как можно исправить ошибку и какие еще есть замечания по поводу кода?
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Чтобы запомнить свои настройки (размеры и положения окон, параметры и т. д.) между сеансами, вам надо изучить класс QSettings.
Класс QSettings предоставляет постоянные независимые от платформы настройки приложения.
Как вариант, это может выглядеть примерно так:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def restore(settings):
finfo = QtCore.QFileInfo(settings.fileName())
if finfo.exists() and finfo.isFile():
for w in QtWidgets.qApp.allWidgets():
mo = w.metaObject()
if w.objectName() != "":
for i in range(mo.propertyCount()):
name = mo.property(i).name()
val = settings.value(
"{}/{}".format(w.objectName(), name),
w.property(name),
type=type(w.property(name)),
)
w.setProperty(name, val)
def save(settings):
for w in QtWidgets.qApp.allWidgets():
mo = w.metaObject()
if w.objectName() != "":
for i in range(mo.propertyCount()):
name = mo.property(i).name()
settings.setValue("{}/{}".format(w.objectName(), name), w.property(name))
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class Example(QWidget):
# !!! +++
settings = QtCore.QSettings("g1450561.ini", QtCore.QSettings.IniFormat) # !!! +++
def __init__(self):
super().__init__()
self.resize(500, 300)
self.setWindowTitle('KeyVoice')
self.setWindowIcon(QIcon('im.png'))
self.items = [
"Вариант 1", "Вариант 2",
"Вариант 3", "Вариант 4",
"Вариант 5", "Вариант 6"
]
self.label = QLabel(self)
self.label.setObjectName("label")
self.comboBox = QComboBox(self)
self.comboBox.setObjectName("comboBox") # !!! +++
self.comboBox.addItems(self.items)
self.comboBox.activated[str].connect(self.onActivated)
self.layout = QtWidgets.QVBoxLayout(self)
self.layout.addWidget(self.label)
self.layout.addWidget(self.comboBox)
restore(self.settings) # !!! +++
self.label.setText(self.items[self.comboBox.currentIndex()])
def onActivated(self, item):
self.label.setText(item)
def closeEvent(self, event): # +++
save(self.settings) # !!! +++
QtWidgets.QWidget.closeEvent(self, event) # +++
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())

