在 Linux 環境下,使用 gtk.gdk(GTK+ 2)直接存取視窗系統繪圖介面,可實現無需外部指令的螢幕截圖功能。本文解析滑鼠框選區域、游標抓取、像素緩衝區儲存全流程。
# Ubuntu/Debian 安裝
sudo apt-get install python-gtk2 python-gobject-2
# 或 pip 安裝(需系統庫支援)
pip install pygtk
注意:此為 GTK+ 2 程式碼。現代 Linux 建議改用 gi.repository.Gdk (GTK 3/4) 或 mss/pyscreenshot 跨平台庫。
| 類別 | 職責 |
|---|---|
MyPoint | 座標點 (x, y) |
MyRect | 矩形區域 (x, y, w, h),支援兩點自動計算 |
MyCaptureGtk | 主控制器:游標抓取、事件處理、截圖儲存 |
gdk.pointer_grab 獨佔滑鼠輸入,設定十字準星游標。gdk.Pixbuf.get_from_drawable 從根視窗讀取像素 → save('png')。
def snap(self, window=None, rect=None, name='screenshot.png'):
# 取得根視窗
display = gdk.display_get_default()
root_win = display.get_default_screen().get_root_window()
# 計算截圖區域
if not rect:
sz = root_win.get_size()
rect = MyRect(0, 0, sz[0], sz[1])
# 建立像素緩衝區並讀取
buf = gdk.Pixbuf(gdk.COLORSPACE_RGB, False, 8, rect.w, rect.h)
buf = buf.get_from_drawable(root_win, root_win.get_colormap(),
rect.x, rect.y, 0, 0, rect.w, rect.h)
if buf:
buf.save(name, 'png')
print(f"截圖已儲存:{name}")
else:
print("截圖失敗")
# 方案一:mss(跨平台、無依賴、高效能)
pip install mss
from mss import mss
with mss() as sct:
sct.shot(output='screenshot.png') # 全螢幕
# 或指定區域:sct.grab({'left': 100, 'top': 100, 'width': 800, 'height': 600})
# 方案二:pyscreenshot(統一介面自動選後端)
pip install pyscreenshot
import pyscreenshot as ImageGrab
im = ImageGrab.grab(bbox=(100, 100, 900, 700))
im.save('screenshot.png')
理解 GTK+ 底層機制有助於除錯與客製化需求,但實務專案建議優先使用 mss 等成熟庫,相容性與維護性更佳。