Найти - Пользователи
Полная версия: Сериализация/десериализация виджета PyQt
Начало » GUI » Сериализация/десериализация виджета PyQt
1
Red_baron
Добрый день!
Пытаюсь реализовать сериализацию и десериализацию виджета PyQt с помощью модуля pickle. Добавил спец. методы для сериализации.
На данный момент такой код:
import pickle, sys
from PyQt4 import QtGui
class MyWindow(QtGui.QWidget):
    """Окно"""
    def __new__(cls, args=None):
        """Метод new"""
        obj = super(MyWindow, cls).__new__(cls)
        return obj
    def __init__(self):
        """Метод init"""
        QtGui.QWidget.__init__(self)
        self.setWindowTitle("Тест")
    def __getstate__(self):
        return self.windowTitle()
        
    def __setstate__(self, value):
        self.setWindowTitle(value)
        
    def __getinitargs__(self):
        flag = True
        return (flag, )
#Создаем экземпляр приложение
app = QtGui.QApplication(sys.argv)
#Создаем эксземпляр класса MainWindow    
obj = MyWindow()
#Сохрание
with open(r'TestFile.txt', 'wb') as f:
    pickle.dump(obj, f, 3)
#востановление
with open(r'TestFile.txt', 'rb') as f:
    obj = pickle.load(f)
#Показываем окно
obj.show()
#Запускаем цикл обработки событий
sys.exit(app.exec_())

Выдает ошибку “super-class __init__ of <__main.MyWindow object …> was never called”.
Как я понимаю, pickle не вызывает __init__? В тоже время __new__ срабатывает. Можно ли из __new__ принудительно вызвать __init__? И как правильно это сделать? Или в pickle как-то указать, что объект требует инициализации.
Red_baron
Решил данную проблему. Надо просто вызвать __init__ из __setstate__.
Привожу код, может кому пригодится:
#Программа тестирования сохранения в файл конструкций PyQt
import pickle, sys
from PyQt4 import QtGui
class MyWindow(QtGui.QWidget):
    """Окно"""
    def __init__(self):
        """Метод init"""
        QtGui.QWidget.__init__(self)
        self.setWindowTitle("Тест")
    def __getstate__(self):
        return self.windowTitle()
        
    def __setstate__(self, value):
        self.__init__()
        self.setWindowTitle(value)
#Создаем экземпляр приложение
app = QtGui.QApplication(sys.argv)
#Создаем эксземпляр класса MainWindow    
obj = MyWindow()
#Сохрание
with open(r'TestFile.txt', 'wb') as f:
    pickle.dump(obj, f, 3)
#востановление
with open(r'TestFile.txt', 'rb') as f:
    obj = pickle.load(f)
#Показываем окно
obj.show()
#Запускаем цикл обработки событий
sys.exit(app.exec_())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB