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


留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
150會員
297內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2024/09/17
生成器本身是一種只能輸出數據的結構,它不像列表或其他容器可以存儲數據並操作。它是一種(lazy evaluation)輸出數據的結構,生成器僅在需要時生成數據。因此,它對於處理大數據集或無限序列時非常高效。 然而,生成器與列表或其他容器不同的一個特點是,生成器通常只能輸出數據,但在某些情況下,我們
Thumbnail
2024/09/17
生成器本身是一種只能輸出數據的結構,它不像列表或其他容器可以存儲數據並操作。它是一種(lazy evaluation)輸出數據的結構,生成器僅在需要時生成數據。因此,它對於處理大數據集或無限序列時非常高效。 然而,生成器與列表或其他容器不同的一個特點是,生成器通常只能輸出數據,但在某些情況下,我們
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
物件導向的SOLID原則包含:單一職責、開閉、里氏替換、介面隔離、依賴反轉 而常見設計模式有:原型、單例、工廠、抽象工廠、建造者、依賴注入 軟體設計模式的三層式架構,衍生出 MVC、MVP、MVVM 等 文章以淺顯易懂的方式說明上述概念,並搭配生活化的例子,幫助讀者理解這些設計原則和模式
Thumbnail
物件導向的SOLID原則包含:單一職責、開閉、里氏替換、介面隔離、依賴反轉 而常見設計模式有:原型、單例、工廠、抽象工廠、建造者、依賴注入 軟體設計模式的三層式架構,衍生出 MVC、MVP、MVVM 等 文章以淺顯易懂的方式說明上述概念,並搭配生活化的例子,幫助讀者理解這些設計原則和模式
Thumbnail
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
在履歷中常常看到導入 MVVM,然後問為什麼要導入 MVVM 時,最常聽到的答案是這樣不會有很肥大的 view controller,但如果再問 view controller 是 MVC 的那一個部分,很多人卻回答不出個所以然,所以想聊聊這個很多種說法的 MVC pattern。
Thumbnail
在履歷中常常看到導入 MVVM,然後問為什麼要導入 MVVM 時,最常聽到的答案是這樣不會有很肥大的 view controller,但如果再問 view controller 是 MVC 的那一個部分,很多人卻回答不出個所以然,所以想聊聊這個很多種說法的 MVC pattern。
Thumbnail
一、前言   這篇文章將會簡單介紹物件導向的設計模式,以及學習這項技術需要有哪些先備知識,學習才會比較順利。 二、設計模式   在物件導向中,除了最基本的五大原則以外,其實還有一知名的概念,那就是設計模式(Design Pattern),它能運用到很多層面。 1. 解決一再出現的問題   許多程式設
Thumbnail
一、前言   這篇文章將會簡單介紹物件導向的設計模式,以及學習這項技術需要有哪些先備知識,學習才會比較順利。 二、設計模式   在物件導向中,除了最基本的五大原則以外,其實還有一知名的概念,那就是設計模式(Design Pattern),它能運用到很多層面。 1. 解決一再出現的問題   許多程式設
Thumbnail
這篇文章將會講述類圖的基本介紹,並且詳細敘述從零開始製作完整的類圖流程。
Thumbnail
這篇文章將會講述類圖的基本介紹,並且詳細敘述從零開始製作完整的類圖流程。
Thumbnail
這篇文章將會講述企劃撰寫給程式員的邏輯流程圖。
Thumbnail
這篇文章將會講述企劃撰寫給程式員的邏輯流程圖。
Thumbnail
小心設計模式別亂用 📷 介紹 設計模式就是過去的人,根據常見的軟體設計的問題,提出的解決方案。 設計模式總共有23種,根據情境分成三大類型,建立型、結構型、行為型。 建立型模式(Creational Patterns) 簡單工廠(Simple Factory) 工廠方法(Factory) 抽象工廠
Thumbnail
小心設計模式別亂用 📷 介紹 設計模式就是過去的人,根據常見的軟體設計的問題,提出的解決方案。 設計模式總共有23種,根據情境分成三大類型,建立型、結構型、行為型。 建立型模式(Creational Patterns) 簡單工廠(Simple Factory) 工廠方法(Factory) 抽象工廠
Thumbnail
介紹 分層架構模式,是將一個軟體系統進行分層,每個軟體系統都去要通過層來隔離不同的關注點,其中最為經典的就是三層架構以及領域驅動設計提出的四層架構。 📷 三層式架構 下面會介紹每一層專門要處理的事情 最常是用的分層方式 至於每層模組的命名方式,每間公司都不太ㄧ樣 📷 參考資料 鐵人賽文章
Thumbnail
介紹 分層架構模式,是將一個軟體系統進行分層,每個軟體系統都去要通過層來隔離不同的關注點,其中最為經典的就是三層架構以及領域驅動設計提出的四層架構。 📷 三層式架構 下面會介紹每一層專門要處理的事情 最常是用的分層方式 至於每層模組的命名方式,每間公司都不太ㄧ樣 📷 參考資料 鐵人賽文章
Thumbnail
ASP.NET Core 6 MVC(VS2022) — 由零開始的入門課 https://9vs1.com/go/?i=192277ff2276 針對開源版本 ASP.NET Core 6 / ASP.NET 6與VS 2022(x64的IDE開發工具)全新上市,特別將課程重新錄製! 課程試聽
Thumbnail
ASP.NET Core 6 MVC(VS2022) — 由零開始的入門課 https://9vs1.com/go/?i=192277ff2276 針對開源版本 ASP.NET Core 6 / ASP.NET 6與VS 2022(x64的IDE開發工具)全新上市,特別將課程重新錄製! 課程試聽
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News