สคริปต์โดยใช้ชัตเตอร์
ฉันไม่คิดว่ามันมีอยู่จริง แต่ก็สามารถทำได้
หากคุณทำให้สคริปต์ด้านล่างพร้อมใช้งานภายใต้คีย์ผสม (คำอธิบายเพิ่มเติมด้านล่าง) หน้าต่างจะปรากฏขึ้นเพื่อให้คุณสามารถตั้งค่าระยะขอบของภาพหน้าจอของคุณทางซ้ายขวาบนและล่างโดยคั่นด้วยช่องว่าง:
ผลลัพธ์:
หรือ:
ผลลัพธ์:
เป็นต้น
ฉันตั้งค่าเริ่มต้นเป็น 30 px แต่คุณสามารถตั้งค่าเริ่มต้นใด ๆ (ดูด้านล่าง)
วิธีใช้
การใช้สคริปต์และShutter
wmctrl
สมมติว่าShutter
มีอยู่ในระบบของคุณแล้ว (เนื่องจากคุณพูดถึงมัน) ให้ติดตั้งwmctrl
:
sudo apt-get install wmctrl
NB ถ้าคุณใช้Kubuntu , Zenity
ไม่ได้ติดตั้งโดยค่าเริ่มต้น:
sudo apt-get install zenity
คัดลอกสคริปต์ด้านล่างเป็นไฟล์ว่าง หากคุณต้องการคุณสามารถเปลี่ยน "ค่าเริ่มต้น" มาร์จในบรรทัดของสคริปต์:
`arg =`
custom_screenshot.py
บันทึกเป็น
เพิ่มสคริปต์ไปยังคีย์ผสมทางลัด: เลือก: การตั้งค่าระบบ> "คีย์บอร์ด"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:
python3 /path/to/custom_screenshot.py
บันทึก
สคริปต์ใช้wmctrl
เพื่อกำหนดตำแหน่งของหน้าต่าง บนตัวจัดการหน้าต่างที่แตกต่างกันอย่างไรก็ตามผลลัพธ์ของwmctrl -lG
คำสั่งแสดงความแตกต่างเล็กน้อยในตำแหน่ง y ของหน้าต่าง ความแตกต่างเหล่านี้ถูกตัดออกโดยค่าที่ตั้งในdeviation=
บรรทัดของสคริปต์ ค่าที่ตั้งไว้ในปัจจุบัน (0) เหมาะสมสำหรับ Unity และ KDE
สคริปต์ยังได้รับการทดสอบและใช้งานได้ดีXfce
และGnome
แต่ต้องเปลี่ยนค่าตามที่อธิบายไว้ในส่วนหัวของสคริปต์
บท
#!/usr/bin/env python3
import subprocess
import time
"""
On different window managers, the window geometry as output of wmctrl differs slightly.
The "deviation" should compensate these differences. Most likely appropriate (tested) settings:
Unity: 0, Gnome: -36, Xfce (Xubuntu): -26, KDE (Kubuntu): 0
"""
#---
deviation = 0
#---
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
try:
arg = get('zenity --entry --entry-text "30 30 30 30" --text "border left, right, top, bottom" --title "Screenshot margins"').strip().split()
except:
pass
else:
time.sleep(0.5)
# frontmost window pos
frontmost = [l.split()[4] for l in get("xprop -root").splitlines() if "ACTIVE_WINDOW(WINDOW)" in l][0].replace(",", "")
frontmost = frontmost[:2]+"0"+frontmost[2:]
f_data = [l.split() for l in get("wmctrl -lG").splitlines() if frontmost in l][0][2:6]
# extent
xt_data = get("xprop -id "+frontmost).split()
xt_i = xt_data.index("_NET_FRAME_EXTENTS(CARDINAL)")
xt = [int(n.replace(",", "")) for n in xt_data[xt_i+2:xt_i+6]]
# set data for screenshot command
x = str(int(f_data[0])-int(arg[0])-xt[0])
y = str(int(f_data[1])-int(arg[2])-xt[2]+deviation)
w = str(int(f_data[2])+int(arg[0])+int(arg[1])+xt[0]+xt[1])
h = str(int(f_data[3])+int(arg[3])+int(arg[2])+xt[2]+xt[3])
command = "shutter -s="+(",").join([x,y,w,h])+" -e"
subprocess.call(["/bin/bash", "-c", command])