首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Linux 下 Python 螢幕截圖實作:GTK+ Gdk 低階繪圖完整教學

     編輯:更多程式設計知識

在 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主控制器:游標抓取、事件處理、截圖儲存

核心流程解析

  1. 游標抓取:gdk.pointer_grab 獨佔滑鼠輸入,設定十字準星游標。
  2. 左鍵兩點定位:第一下記錄起點,第二下記錄終點 → 形成矩形。
  3. 截圖儲存:gdk.Pixbuf.get_from_drawable 從根視窗讀取像素 → save('png')。
  4. 右鍵取消/退出:釋放游標抓取,結束主迴圈。

關鍵程式碼片段


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 等成熟庫,相容性與維護性更佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved