【发布时间】:2021-04-22 14:02:12
【问题描述】:
我正在尝试将逻辑和 UI 分开。在下面的代码中,我有 UI 和逻辑类。目标是用数据填充列表小部件 - 找到的 json 文件列表。在 UI 的第一次启动时,它从 Data() 获取数据并用它填充列表。连接到 Data()create() 方法的按钮必须创建新文件并用新数据填充列表。我发现这样做的唯一方法是将主窗口传递给 Data 并进行刷新,我认为这违反了这种分离 UI 和逻辑的模型。逻辑部分不应该对 UI 有任何了解。
from PySide2 import QtGui
from PySide2 import QtWidgets
import os
import json
HOME = os.path.expanduser("~")
class View(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
resolution = QtGui.QGuiApplication.primaryScreen().availableGeometry()
self.setMinimumSize(resolution.width() * 0.25, resolution.height() * 0.3)
self._central_widget = QtWidgets.QWidget()
self.setCentralWidget(self._central_widget)
self._list_widget_layout = QtWidgets.QVBoxLayout()
self._buttons_layout = QtWidgets.QHBoxLayout()
self._list_widget = QtWidgets.QListWidget()
self._button = QtWidgets.QPushButton("Button")
self._central_widget.setLayout(self._list_widget_layout)
self._list_widget_layout.addWidget(self._list_widget)
self._list_widget_layout.addLayout(self._buttons_layout)
self._buttons_layout.addWidget(self._button)
self._add_info = Data()
# Connect
self._button.clicked.connect(lambda: self._add_info.create(self))
self.fill_list()
def fill_list(self):
self._list_widget.clear()
for i in self._add_info.get_folder_content_by_extension(path=HOME, ext="json"):
item = QtWidgets.QListWidgetItem()
item.setText(i)
self._list_widget.addItem(item)
class Data(object):
def create(self, main_window):
data_dict = {"A": "1", "B": "2", "C": "3" }
self.save_json(path=os.path.join(HOME, "new_file.json"), save_dict=data_dict)
main_window.fill_list()
@classmethod
def get_folder_content_by_extension(cls, path=None, ext=None):
folder_content = list()
for f in os.listdir(path):
if f.endswith(".{}".format(ext)):
folder_content.append(os.path.join(path, f))
return folder_content
@classmethod
def save_json(cls, path, save_dict):
with open(path, "w") as json_file:
json.dump(save_dict, json_file, indent=4)
if __name__ == "__main__":
app = QtWidgets.QApplication([])
w = View()
w.show()
app.exec_()
【问题讨论】:
-
分离逻辑和 UI(与 MVC 等许多常见模式一样)不是应该总是做的事情。这些范式很重要也很有用,但只有在它们的实施真正带来好处时才应该使用它们。你的分离是否真的为你的代码带来了好处?它是否提高了代码的质量(包括可读性和维护性)? OOP 主要是关于模块化和可重用性,这种分离是否为它们提供了有用的方式?
-
我不是软件工程师,也许我错了。也许在查看几个月后,如果代码的可读性足够好,我会更清楚。
标签: python-3.x user-interface logic pyside