類別與 PyQt 的使用
學習內容
- 使用 Python Class 的基本用法。
- 了解 __name__ == '__main__'的用法。
- 用 PyQt6 建立基本主視窗。
- 添加計數功能。
class 的用法
在 Python 中,class 是用來定義類別 (Class) 的關鍵字,類別是物件導向編程 (Object-Oriented Programming, OOP) 中的一個基礎概念。類別是對現實世界事物的抽象,可以包含變數(稱為屬性)和函式(稱為方法)。
語法:
class ClassName:
    # 屬性(變數)
    # 方法(函式)__init__ 與 self
__init__ 是用來初始化物件的方法,只要宣告物件變數,就會將類別具象化為實例 (instance) 並自動執行 __init__ 方法。一般來說,__init__ 是類別的初始化方法 (initializer),用來設定物件的初始屬性。
在類別的使用中,會經常看到 self 這個關鍵字,一般來說,self 是用來指代類別實例 (instance) 本身的參考,它並不是一個保留字,但是一個強烈建議的命名約定,用來在類別的定義中訪問屬性或方法。
每次呼叫類別中的方法時,Python 會自動將呼叫該方法的物件作為第一個參數傳遞給方法,這個參數通常命名為 self。透過 self,可以訪問和修改物件的屬性,或者呼叫該物件內部的方法。
範例:
class Dog:
    # 屬性
    def __init__(self, name, age):
        self.name = name  # 屬性
        self.age = age    # 屬性
    # 方法
    def intro(self):
        print(f"{self.name} is {self.age} years old!")
# 創建物件
dog1 = Dog("Buddy", 3)
dog1.intro()  # 輸出:Buddy is 3 years old!
dog2 = Dog("Candy", 5)
dog2.intro()  # 輸出:Candy is 5 years old!- class Dog:定義類別- Dog。
- 當我們創建 Dog類別的實例dog1和dog2時,__init__方法會自動被呼叫。
- __init__是類別的初始化方法,通常用來初始化物件的屬性。
- self是指物件本身(即類別的實例),用來訪問屬性和方法。
- 在 __init__中,我們使用self.name和self.age設置個別物件的屬性。
__name__ == '__main__' 的用法
__name__ == '__main__' 是一個用來判斷 Python 檔案是否被直接執行的條件。當一個 Python 檔案被直接執行時,__name__ 的值為 '__main__';而當這個檔案作為模組被導入到其他檔案時,__name__ 的值是模組的名稱。假設我們寫了一個檔案 todo.py,最後有一段內容如下:
if __name__ == "__main__":
    # Code Block當我們用 Python 執行這個檔案時 (python todo.py),上面的 Code Block 區段會被執行。但如果是其他檔引入這個檔案 (import todo) 作為模組使用,則 Code Block 區段不會被執行(因為 __name__ 不會等於 '__main__')。
為什麼要使用 if __name__ == '__main__'?
這個語句經常用於 模組測試:你可以在檔案中寫一些測試用的程式碼,用來驗證模組的功能,而當此檔案被導入作為其他程式的模組時,則不會執行這些程式碼。
PyQt6 程式碼範例
import sys
from PyQt6.QtWidgets import QApplication, QLabel, QPushButton
from PyQt6.QtWidgets import QVBoxLayout, QWidget
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt6 基本 GUI")
        self.resize(400, 300)
        # 建立標籤與按鈕
        self.label = QLabel("按下按鈕開始計數!", self)
        self.button = QPushButton("點擊我", self)
        # 計數變數
        self.counter = 0
        # 設定佈局
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.button)
        self.setLayout(layout)
        # 連接按鈕點擊事件
        self.button.clicked.connect(self.increment_counter)
    def increment_counter(self):
        self.counter += 1
        self.label.setText(f"按鈕已被點擊 {self.counter} 次!")
# 主程式入口
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())程式碼講解
1. 模組導入
import sys
from PyQt6.QtWidgets import QApplication, QLabel, QPushButton
from PyQt6.QtWidgets import QVBoxLayout, QWidget- sys:用於處理系統參數,例如- sys.argv,以便 PyQt6 能接受命令列參數。
- QApplication:PyQt6 應用程式的基類,用於管理事件迴圈。
- QLabel:顯示文字的標籤元件。
- QPushButton:按鈕元件,用來接收用戶點擊操作。
- QVBoxLayout:垂直佈局管理器,用於排列元件。
- QWidget:所有視窗元件的基類。
2. 定義主視窗類別
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()- class MainWindow(QWidget):- 定義一個名為 MainWindow的類別,繼承自QWidget,作為主視窗。
 
- 定義一個名為 
- __init__- 初始化方法,當創建 MainWindow的實例時會自動呼叫。super().__init__()確保父類的初始化邏輯被執行。
 
- 初始化方法,當創建 
3. 視窗屬性與元件初始化
self.setWindowTitle("PyQt6 基本 GUI")
self.resize(400, 300)- setWindowTitle():設定視窗的標題為 "PyQt6 基本 GUI"。
- resize():設定視窗的初始大小為 400x300 像素。
建立元件
self.label = QLabel("按下按鈕開始計數!", self)
self.button = QPushButton("點擊我", self)- QLabel- self.label = QLabel("按下按鈕開始計數!", self)創建一個標籤,顯示初始文字 "按下按鈕開始計數!"。
 
- QPushButton- self.button = QPushButton("點擊我", self)創建一個按鈕,顯示文字 "點擊我"。
 
4. 計數變數與佈局
self.counter = 0- self.counter- 計數變數,用來記錄按鈕點擊的次數,初始值為 0。
 
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.button)
self.setLayout(layout)- QVBoxLayout- 垂直佈局管理器,用來按順序排列標籤與按鈕。
- layout.addWidget(self.label):將標籤添加到佈局中。
- layout.addWidget(self.button):將按鈕添加到佈局中。
- self.setLayout(layout):將此佈局應用到主視窗。
 
5. 按鈕點擊事件處理
self.button.clicked.connect(self.increment_counter)- clicked.connect()- 將按鈕的點擊事件連接到方法 increment_counter。
- 當按鈕被點擊時,會自動執行 self.increment_counter。
 
- 將按鈕的點擊事件連接到方法 
6. 按鈕事件邏輯
def increment_counter(self):
    self.counter += 1
    self.label.setText(f"按鈕已被點擊 {self.counter} 次!")- self.counter += 1- 每次按鈕被點擊時,計數器 self.counter增加 1。
 
- 每次按鈕被點擊時,計數器 
- self.label.setText()- 更新標籤的文字,顯示點擊的次數,例如 "按鈕已被點擊 5 次!"。
 
7. 主程式入口
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())- if __name__ == "__main__":- 確保程式僅在直接執行時執行此段代碼,當作為模組導入時不執行。
 
- QApplication(sys.argv)- 創建應用程式物件 app,負責管理事件迴圈。
 
- 創建應用程式物件 
- MainWindow()- 創建主視窗的實例 window。
 
- 創建主視窗的實例 
- window.show()- 顯示主視窗。
 
- sys.exit(app.exec())- 啟動事件迴圈,讓應用程式進入等待與處理用戶事件的狀態。
- sys.exit()確保程式在事件迴圈結束時正常退出。
 
練習
- 當計數超過 10 時,顯示提示「點擊次數超過 10!」。
- 添加一個「重置」按鈕,點擊後計數歸零並恢復初始狀態。
