import random import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QMainWindow, QFormLayout, QLineEdit, QSpinBox, QComboBox, QPushButton, QApplication, \ QWidget, QCheckBox model = { "name": "Johnina Smith", "age": 10, "favorite_icecream": "Vanilla", "disable_details": False, } backups = [] class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("MVC Example") layout = QFormLayout() # Dictionary to store the form data, with default data. self.name = QLineEdit() self.name.textChanged.connect(self.on_name_changed) self.age = QSpinBox() self.age.setRange(0, 200) self.age.valueChanged.connect(self.on_age_changed) self.icecream = QComboBox() self.icecream.addItems(["Vanilla", "Strawberry", "Chocolate"]) self.icecream.currentTextChanged.connect(self.on_icecream_changed) self.save_btn = QPushButton("Save") self.save_btn.clicked.connect(self.on_save_clicked) self.restore_btn = QPushButton("Restore") self.restore_btn.clicked.connect(self.on_restore_clicked) self.disable_details = QCheckBox("Disable Details?") self.disable_details.toggled.connect(self.on_disable_details_toggled) layout.addRow("Name", self.name) layout.addRow("Age", self.age) layout.addRow("Favorite Ice Cream", self.icecream) layout.addWidget(self.disable_details) # QCheckBox has its own label. layout.addRow(self.save_btn) layout.addRow(self.restore_btn) layout.setLabelAlignment(Qt.AlignLeft) widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) self.update_ui() def update_ui(self): self.name.setText(model["name"]) self.age.setValue(model["age"]) self.icecream.setCurrentText(model["favorite_icecream"]) self.disable_details.setChecked(model["disable_details"]) self.age.setDisabled(model["disable_details"]) self.icecream.setDisabled(model["disable_details"]) def on_name_changed(self, value): model["name"] = value print(model) def on_age_changed(self, value): model["age"] = value print(model) def on_icecream_changed(self, value): model["favorite_icecream"] = value print(model) def on_save_clicked(self): backups.append(model.copy()) print("SAVE:", model) print("BACKUPS:", len(backups)) def on_restore_clicked(self): if not backups: return random.shuffle(backups) backup = backups.pop() # Remove a backup model.update(backup) # Overwrite the data in the model self.update_ui() print("RESTORE:", model) print("BACKUPS:", len(backups)) def on_disable_details_toggled(self, value): model["disable_details"] = value print(model) self.update_ui() if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_()