todo_1.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import os
  2. import sys
  3. import json
  4. from PyQt5.QtCore import QAbstractListModel, Qt
  5. from PyQt5.QtGui import QImage
  6. from PyQt5.QtWidgets import QApplication, QMainWindow
  7. from MainWindow import Ui_MainWindow
  8. basedir = os.path.dirname(__file__)
  9. flag = QImage(os.path.join(basedir, 'flag.png'))
  10. class TodoModel(QAbstractListModel):
  11. def __init__(self, todos=None):
  12. super().__init__()
  13. self.todos = todos or []
  14. def data(self, index, role):
  15. if role == Qt.DisplayRole:
  16. status, text = self.todos[index.row()]
  17. return text
  18. if role == Qt.DecorationRole:
  19. status, text = self.todos[index.row()]
  20. if status:
  21. return flag
  22. def rowCount(self, index):
  23. return len(self.todos)
  24. class MainWindow(QMainWindow, Ui_MainWindow):
  25. def __init__(self, *args, **kwargs):
  26. super().__init__(*args, **kwargs)
  27. self.setupUi(self)
  28. self.model = TodoModel()
  29. self.load()
  30. self.todoView.setModel(self.model)
  31. # Connect the button
  32. self.addButton.pressed.connect(self.add)
  33. self.deleteButton.pressed.connect(self.delete)
  34. self.completeButton.pressed.connect(self.complete)
  35. def load(self):
  36. try:
  37. with open("data.json", "r") as f:
  38. self.model.todos = json.load(f)
  39. except Exception as e:
  40. print(e)
  41. def save(self):
  42. with open("data.json", "w") as f:
  43. json.dump(self.model.todos, f)
  44. def add(self):
  45. """
  46. Add an item to our todos list, getting the QLineEdit.todoEdit
  47. and then clearing it
  48. :return:
  49. """
  50. text = self.todoEdit.text()
  51. text = text.strip() # Remove whitespace
  52. if text: # Don't add empty strings
  53. self.model.todos.append((False, text))
  54. # Trigger refresh
  55. self.model.layoutChanged.emit()
  56. # Empty the input
  57. self.todoEdit.setText("")
  58. self.save()
  59. def delete(self):
  60. """
  61. Delete the currently selected item from our model
  62. :return:
  63. """
  64. indexes = self.todoView.selectedIndexes()
  65. if indexes:
  66. index = indexes[0]
  67. # Remove the item and refresh
  68. del self.model.todos[index.row()]
  69. self.model.layoutChanged.emit()
  70. # Clear the selection (as it is no longer valid).
  71. self.todoView.clearSelection()
  72. self.save()
  73. def complete(self):
  74. """
  75. Mark the currently selected item as completed
  76. :return:
  77. """
  78. indexes = self.todoView.selectedIndexes()
  79. if indexes:
  80. index = indexes[0]
  81. row = index.row()
  82. status, text = self.model.todos[row]
  83. self.model.todos[row] = (True, text)
  84. # Emit dataChanged to update the view
  85. self.model.dataChanged.emit(index, index)
  86. # Clear the selection
  87. self.todoView.clearSelection()
  88. self.save()
  89. if __name__ == '__main__':
  90. app = QApplication(sys.argv)
  91. window = MainWindow()
  92. window.show()
  93. sys.exit(app.exec_())