類別與 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!」。
- 添加一個「重置」按鈕,點擊後計數歸零並恢復初始狀態。