在一個典型的程式專案中,UI
、Controller
和 Main
的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。
用Main.py來啟動程式
my_calculator_project/
│
├── controller.py # 控制器:處理業務邏輯、UI 交互
├── main.py # 主程序入口:啟動應用
├── model.py # 業務邏輯處理:包含數學運算等邏輯
├── view.py # 界面設計(UI):定義用戶界面
└── resources/ # 存放靜態資源如圖片、樣式表等(可選)
model.py
包含我們的業務邏輯,處理所有計算:
# model.py
class CalculatorModel:
"""
業務邏輯模型:包含加法和乘法的業務邏輯
"""
def add(self, num1, num2):
"""執行加法運算"""
return num1 + num2
def multiply(self, num1, num2):
"""執行乘法運算"""
return num1 * num2
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)
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
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()
model.py
:負責業務邏輯處理,簡單的加法和乘法運算。view.py
:定義應用的界面,包括輸入框、按鈕和標籤。controller.py
:負責處理界面上的操作,調用業務邏輯,並更新 UI。main.py
:啟動應用,並將模型、視圖和控制器連接起來。這樣的項目結構是典型的 MVC 模式,使得應用的不同層次(數據、邏輯、界面)清晰分離。這樣做有助於維護和擴展應用程式,當需要更改某一部分(如增加更多計算操作或更換界面設計)時,只需在相應的模塊中進行修改,而不會影響其他部分。