[Python]程式專案中通常遵循 MVC的架構

閱讀時間約 11 分鐘

在一個典型的程式專案中,UIControllerMain 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。



大部分典型的程式專案設計

  1. UI (View):專注於用戶界面,展示數據,並將用戶操作轉交給 Controller。
  2. Controller:負責業務邏輯,接收 UI 的信號並處理,並將結果更新回視圖或數據模型。
  3. Main:啟動應用程式,創建主要窗口,並啟動應用的事件循環。

以下就用一個簡單的計算機來作為範例介紹

用Main.py來啟動程式

raw-image

1. 專案結構

my_calculator_project/

├── controller.py # 控制器:處理業務邏輯、UI 交互
├── main.py # 主程序入口:啟動應用
├── model.py # 業務邏輯處理:包含數學運算等邏輯
├── view.py # 界面設計(UI):定義用戶界面
└── resources/ # 存放靜態資源如圖片、樣式表等(可選)

2. model.py - 邏輯

model.py 包含我們的業務邏輯,處理所有計算:

# model.py

class CalculatorModel:
"""
業務邏輯模型:包含加法和乘法的業務邏輯
"""

def add(self, num1, num2):
"""執行加法運算"""
return num1 + num2

def multiply(self, num1, num2):
"""執行乘法運算"""
return num1 * num2

3. view.py - 界面設計(UI)

view.py 定義了應用的用戶界面,包含輸入框、按鈕和顯示結果的標籤。

# view.py

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QLineEdit

class CalculatorView(QWidget):
"""
界面設計:定義了兩個輸入框、兩個按鈕和顯示結果的標籤
"""

def __init__(self):
super().__init__()

# 設置 UI 元件
self.input1 = QLineEdit()
self.input1.setPlaceholderText("輸入數字 1")

self.input2 = QLineEdit()
self.input2.setPlaceholderText("輸入數字 2")

self.result_label = QLabel("計算結果將顯示在此")
self.add_button = QPushButton("相加")
self.multiply_button = QPushButton("相乘")

# 設置佈局
input_layout = QHBoxLayout()
input_layout.addWidget(self.input1)
input_layout.addWidget(self.input2)

button_layout = QHBoxLayout()
button_layout.addWidget(self.add_button)
button_layout.addWidget(self.multiply_button)

layout = QVBoxLayout()
layout.addLayout(input_layout)
layout.addLayout(button_layout)
layout.addWidget(self.result_label)

# 設置視圖
self.setLayout(layout)

4. controller.py - 控制器(連接業務邏輯與界面)

controller.py 負責將用戶的操作(點擊按鈕等)與業務邏輯相連,並更新界面。

# controller.py

from model import CalculatorModel
from view import CalculatorView

class CalculatorController:
"""
控制器:處理 UI 的交互並調用業務邏輯
"""

def __init__(self, model: CalculatorModel, view: CalculatorView):
self.model = model
self.view = view

# 連接按鈕的點擊事件與處理邏輯
self.view.add_button.clicked.connect(self.handle_addition)
self.view.multiply_button.clicked.connect(self.handle_multiplication)

def handle_addition(self):
"""處理加法邏輯"""
num1, num2 = self.get_inputs()
if num1 is not None and num2 is not None:
result = self.model.add(num1, num2)
self.view.result_label.setText(f"相加結果: {result}")
else:
self.view.result_label.setText("請輸入有效的數字")

def handle_multiplication(self):
"""處理乘法邏輯"""
num1, num2 = self.get_inputs()
if num1 is not None and num2 is not None:
result = self.model.multiply(num1, num2)
self.view.result_label.setText(f"相乘結果: {result}")
else:
self.view.result_label.setText("請輸入有效的數字")

def get_inputs(self):
"""從輸入框獲取數據,並處理非法輸入"""
try:
num1 = float(self.view.input1.text())
num2 = float(self.view.input2.text())
return num1, num2
except ValueError:
return None, None

5. main.py - 主程序入口

main.py 負責啟動應用,初始化控制器、模型和視圖,並啟動應用程式。

# main.py

import sys
from PyQt5.QtWidgets import QApplication
from model import CalculatorModel
from view import CalculatorView
from controller import CalculatorController

def main():
# 創建應用程序
app = QApplication(sys.argv)

# 創建模型、視圖和控制器
model = CalculatorModel()
view = CalculatorView()
controller = CalculatorController(model, view)

# 顯示視圖
view.show()

# 啟動應用程序事件循環
sys.exit(app.exec_())

if __name__ == "__main__":
main()



小結:

  1. model.py:負責業務邏輯處理,簡單的加法和乘法運算。
  2. view.py:定義應用的界面,包括輸入框、按鈕和標籤。
  3. controller.py:負責處理界面上的操作,調用業務邏輯,並更新 UI。
  4. main.py:啟動應用,並將模型、視圖和控制器連接起來。

這樣的項目結構是典型的 MVC 模式,使得應用的不同層次(數據、邏輯、界面)清晰分離。這樣做有助於維護和擴展應用程式,當需要更改某一部分(如增加更多計算操作或更換界面設計)時,只需在相應的模塊中進行修改,而不會影響其他部分。


119會員
201內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
生成器本身是一種只能輸出數據的結構,它不像列表或其他容器可以存儲數據並操作。它是一種(lazy evaluation)輸出數據的結構,生成器僅在需要時生成數據。因此,它對於處理大數據集或無限序列時非常高效。 然而,生成器與列表或其他容器不同的一個特點是,生成器通常只能輸出數據,但在某些情況下,我們
生成器表達式是 Python 中一種更簡潔的語法,專門用來創建生成器。它的語法與列表生成式類似,但將列表生成式中的方括號 [] 替換為小括號 ()。生成器表達式與生成器函數類似,具有「惰性評估」的特性,因此它只在需要時才生成元素,從而節省記憶體。 生成器的「惰性評估」(也叫延遲求值)指的是生成器不
呈上篇[Python基礎]類別繼承(Inheritance) 中使用的super()並加以說明,此篇文章主要敘述使用super()有什麼好處及優點。 super():是一個內建函數,用來返回父類別的物件,以便你可以使用這個物件來呼叫父類別的方法或屬性。 這種做法的目的是在子類別中繼承並延續父類別
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
在 Python 中,tuple 與 List有一個關鍵的不同點:tuple 是不可變的,這意味著一旦創建了 tuple,就無法更改其內容。 這與 List的可變性形成了對比,list 可以新增、刪除或修改元素。 元素的意思: 元素:指的是 List 中的每一個獨立的項目或值。
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
生成器本身是一種只能輸出數據的結構,它不像列表或其他容器可以存儲數據並操作。它是一種(lazy evaluation)輸出數據的結構,生成器僅在需要時生成數據。因此,它對於處理大數據集或無限序列時非常高效。 然而,生成器與列表或其他容器不同的一個特點是,生成器通常只能輸出數據,但在某些情況下,我們
生成器表達式是 Python 中一種更簡潔的語法,專門用來創建生成器。它的語法與列表生成式類似,但將列表生成式中的方括號 [] 替換為小括號 ()。生成器表達式與生成器函數類似,具有「惰性評估」的特性,因此它只在需要時才生成元素,從而節省記憶體。 生成器的「惰性評估」(也叫延遲求值)指的是生成器不
呈上篇[Python基礎]類別繼承(Inheritance) 中使用的super()並加以說明,此篇文章主要敘述使用super()有什麼好處及優點。 super():是一個內建函數,用來返回父類別的物件,以便你可以使用這個物件來呼叫父類別的方法或屬性。 這種做法的目的是在子類別中繼承並延續父類別
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
在 Python 中,tuple 與 List有一個關鍵的不同點:tuple 是不可變的,這意味著一旦創建了 tuple,就無法更改其內容。 這與 List的可變性形成了對比,list 可以新增、刪除或修改元素。 元素的意思: 元素:指的是 List 中的每一個獨立的項目或值。
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
MVVMC(Model View ViewModel Coordinator),特點是Coordinator。 Model 負責儲存應用程式的資料。 View 負責顯示資料。 ViewModel 負責處理View和Model之間的狀態關係。 Coordinator 負
MVI(Model View Intent),特點是Intent。 Model 負責介面狀態 View 負責顯示資料。 Intent 負責將封裝後的操作告知Model。
MVVM(Model View ViewModel),特點是View跟ViewModel之間做資料綁定。 Model 負責儲存應用程式的資料。 View 負責顯示資料。 ViewModel 負責處理View和Model之間的狀態關係。
MVP(Model View Presenter)由MVC演變而來。MVC與MVP的差異是View跟Model之間的關係;MVC中是可以直接溝通的;MVP中是不可以直接溝通的,必須要透過 Presenter。 Model 負責資料存取。 View 負責顯示資料,並將使用者的操作傳給P
※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
Thumbnail
這篇文章介紹了 iOS 中常用的 Design Patterns,包括 MVC、MVVM、Singleton、Delegation、Observer 等。同時比較了 Delegate 和 Notification 的使用時機。參考資料中還有更多相關資訊。
Thumbnail
本文紀錄了MVC和MVVM的差異,包括各自的優缺點和最大差異,並討論了MVVM的商業邏輯應該寫在哪的問題。
本節課程將介紹 MVVM 架構的概念和優點。MVVM 是 Model-View-ViewModel 的簡稱,是一種分離資料、介面和邏輯的設計模式。透過 MVVM 架構,您可以提高程式碼的可讀性、可測試性和可維護性。
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
MVVMC(Model View ViewModel Coordinator),特點是Coordinator。 Model 負責儲存應用程式的資料。 View 負責顯示資料。 ViewModel 負責處理View和Model之間的狀態關係。 Coordinator 負
MVI(Model View Intent),特點是Intent。 Model 負責介面狀態 View 負責顯示資料。 Intent 負責將封裝後的操作告知Model。
MVVM(Model View ViewModel),特點是View跟ViewModel之間做資料綁定。 Model 負責儲存應用程式的資料。 View 負責顯示資料。 ViewModel 負責處理View和Model之間的狀態關係。
MVP(Model View Presenter)由MVC演變而來。MVC與MVP的差異是View跟Model之間的關係;MVC中是可以直接溝通的;MVP中是不可以直接溝通的,必須要透過 Presenter。 Model 負責資料存取。 View 負責顯示資料,並將使用者的操作傳給P
※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
Thumbnail
這篇文章介紹了 iOS 中常用的 Design Patterns,包括 MVC、MVVM、Singleton、Delegation、Observer 等。同時比較了 Delegate 和 Notification 的使用時機。參考資料中還有更多相關資訊。
Thumbnail
本文紀錄了MVC和MVVM的差異,包括各自的優缺點和最大差異,並討論了MVVM的商業邏輯應該寫在哪的問題。
本節課程將介紹 MVVM 架構的概念和優點。MVVM 是 Model-View-ViewModel 的簡稱,是一種分離資料、介面和邏輯的設計模式。透過 MVVM 架構,您可以提高程式碼的可讀性、可測試性和可維護性。