mvc_2.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import random
  2. import sys
  3. from PyQt5.QtCore import Qt
  4. from PyQt5.QtWidgets import QMainWindow, QFormLayout, QLineEdit, QSpinBox, QComboBox, QPushButton, QApplication, \
  5. QWidget, QCheckBox
  6. model = {
  7. "name": "Johnina Smith",
  8. "age": 10,
  9. "favorite_icecream": "Vanilla",
  10. "disable_details": False,
  11. }
  12. backups = []
  13. class MainWindow(QMainWindow):
  14. def __init__(self):
  15. super().__init__()
  16. self.setWindowTitle("MVC Example")
  17. layout = QFormLayout()
  18. # Dictionary to store the form data, with default data.
  19. self.name = QLineEdit()
  20. self.name.textChanged.connect(self.on_name_changed)
  21. self.age = QSpinBox()
  22. self.age.setRange(0, 200)
  23. self.age.valueChanged.connect(self.on_age_changed)
  24. self.icecream = QComboBox()
  25. self.icecream.addItems(["Vanilla", "Strawberry", "Chocolate"])
  26. self.icecream.currentTextChanged.connect(self.on_icecream_changed)
  27. self.save_btn = QPushButton("Save")
  28. self.save_btn.clicked.connect(self.on_save_clicked)
  29. self.restore_btn = QPushButton("Restore")
  30. self.restore_btn.clicked.connect(self.on_restore_clicked)
  31. self.disable_details = QCheckBox("Disable Details?")
  32. self.disable_details.toggled.connect(self.on_disable_details_toggled)
  33. layout.addRow("Name", self.name)
  34. layout.addRow("Age", self.age)
  35. layout.addRow("Favorite Ice Cream", self.icecream)
  36. layout.addWidget(self.disable_details) # QCheckBox has its own label.
  37. layout.addRow(self.save_btn)
  38. layout.addRow(self.restore_btn)
  39. layout.setLabelAlignment(Qt.AlignLeft)
  40. widget = QWidget()
  41. widget.setLayout(layout)
  42. self.setCentralWidget(widget)
  43. self.update_ui()
  44. def update_ui(self):
  45. self.name.setText(model["name"])
  46. self.age.setValue(model["age"])
  47. self.icecream.setCurrentText(model["favorite_icecream"])
  48. self.disable_details.setChecked(model["disable_details"])
  49. self.age.setDisabled(model["disable_details"])
  50. self.icecream.setDisabled(model["disable_details"])
  51. def on_name_changed(self, value):
  52. model["name"] = value
  53. print(model)
  54. def on_age_changed(self, value):
  55. model["age"] = value
  56. print(model)
  57. def on_icecream_changed(self, value):
  58. model["favorite_icecream"] = value
  59. print(model)
  60. def on_save_clicked(self):
  61. backups.append(model.copy())
  62. print("SAVE:", model)
  63. print("BACKUPS:", len(backups))
  64. def on_restore_clicked(self):
  65. if not backups:
  66. return
  67. random.shuffle(backups)
  68. backup = backups.pop() # Remove a backup
  69. model.update(backup) # Overwrite the data in the model
  70. self.update_ui()
  71. print("RESTORE:", model)
  72. print("BACKUPS:", len(backups))
  73. def on_disable_details_toggled(self, value):
  74. model["disable_details"] = value
  75. print(model)
  76. self.update_ui()
  77. if __name__ == "__main__":
  78. app = QApplication(sys.argv)
  79. window = MainWindow()
  80. window.show()
  81. app.exec_()