Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Сериализация/десериализация виджета PyQt [RSS Feed]

#1 Фев. 10, 2014 06:08:04

Red_baron
Зарегистрирован: 2012-08-30
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Сериализация/десериализация виджета PyQt

Добрый день!
Пытаюсь реализовать сериализацию и десериализацию виджета 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 как-то указать, что объект требует инициализации.

Офлайн

#2 Фев. 11, 2014 16:23:59

Red_baron
Зарегистрирован: 2012-08-30
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Сериализация/десериализация виджета PyQt

Решил данную проблему. Надо просто вызвать __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_())

Офлайн

  • Начало
  • » GUI
  • » Сериализация/десериализация виджета PyQt[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version