มันทำงานอย่างไร
สคริปต์ด้านล่างวัดขนาดของพื้นที่ระหว่างสองตำแหน่งของตัวชี้เมาส์
มันทำงานได้ดังต่อไปนี้:
วางตัวชี้เมาส์ในตำแหน่งแรก (โดยไม่ต้องคลิก)
กดปุ่มผสมที่คุณต้องการ (ดูเพิ่มเติมด้านล่าง)
วางเมาส์ในตำแหน่งที่สอง (อีกครั้งโดยไม่ต้องคลิก)
กดคีย์ผสมของคุณอีกครั้ง การแจ้งเตือนจะบอกขนาดที่แน่นอน (px) ของพื้นที่
ตัวเลือก
คุณสามารถเลือก (โดยไม่ใส่เครื่องหมายในบรรทัดใดบรรทัดหนึ่ง) วิธีที่คุณต้องการรับการแจ้งเตือน ทั้งโดยการแจ้งเตือน:
หรือหน้าต่างข้อมูล Zenity:
(ตัวอย่างมาจากพื้นที่ที่แตกต่างกัน)
วิธีใช้
สคริปต์ใช้xdotool
:
sudo apt-get install xdotool
คัดลอกสคริปต์ด้านล่างลงในไฟล์เปล่าโดยไม่ใส่เครื่องหมายข้อคิดเห็นบรรทัดใดบรรทัดหนึ่ง:
command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
(ต้องได้รับการแจ้งเตือนจากnotify-send
ตัวเลือก)
หรือ:
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
สำหรับZenity
ตัวเลือก
บันทึกสคริปต์ใน~/bin
(คุณอาจจะต้องสร้างไดเรกทอรี) เป็นmeasure_area
(ไม่มีส่วนขยาย) และทำให้สามารถเรียกใช้งานได้
เพิ่มคีย์ผสมที่คุณเลือกเพื่อเรียกใช้สคริปต์: เลือก: การตั้งค่าระบบ> "คีย์บอร์ด"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:
measure_area
หมายเหตุ
- คุณจะต้องออกจากระบบ / เข้าก่อน
- มันไม่ได้สร้างความแตกต่างในสิ่งที่คุณทำในตำแหน่งแรก / วินาที สคริปต์ที่มีขนาดที่แน่นอนค่า
บท
#!/usr/bin/env python3
import subprocess
import os
import math
home = os.environ["HOME"]
area = home+"/"+".measure_area.txt"
def get_pos():
pos_data = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8")
return [m[2:] for m in pos_data.split()[:2]]
def confirm():
get = subprocess.check_output(["xrandr", "--verbose"]).decode("utf-8").split()
for s in [get[i-1] for i in range(len(get)) if get[i] == "connected"]:
br_data = float(get[get.index("Brightness:")+1])
brightness = lambda br: ["xrandr", "--output", s, "--brightness", br]
flash = ["sleep", "0.1"]
for cmd in [brightness(str(br_data-0.1)), flash, brightness(str(br_data))]:
subprocess.call(cmd)
if not os.path.exists(area):
with open(area, "wt") as measure:
measure.write(str(get_pos()))
confirm()
else:
second = get_pos()
with open(area) as first_m:
try:
first = eval(first_m.read())
w = int(math.fabs(int(second[0]) - int(first[0])))
h = int(math.fabs(int(second[1]) - int(first[1])))
#--- uncomment either one of the lines below:
# command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
#---
confirm()
except SyntaxError:
text = "Please try again, there was an error in the data"
command = ['zenity', '--info', '--title', 'Please try again', '--text', text]
subprocess.Popen(command)
os.remove(area)
คำอธิบาย
เมื่อสคริปต์ถูกเรียกครั้งแรกสคริปต์จะรับตำแหน่งเมาส์ปัจจุบันพร้อมxdotool
คำสั่ง:
xdotool getmouselocation
จากนั้นจะบันทึกตำแหน่งลงในไฟล์ (มองไม่เห็น) .measure_area.txt
รอสายที่สอง
ในการเรียกครั้งที่สองมันจะอ่านไฟล์ลบออกและเปรียบเทียบx/y
พิกัดที่เก็บไว้กับพิกัดล่าสุดและคำนวณขนาดของพื้นที่ระหว่างพวกเขา
แก้ไข
อัปเดตสคริปต์ด้วยการปรับปรุงจำนวนมาก:
- ปรับให้เหมาะสม
subprocess.Popen()
/ subprocess.check_output()
คำสั่ง (ขอบคุณ @muru, @Trengot)
- เพิ่มขั้นตอนการซ่อมแซมในกรณีที่มีสิ่งผิดปกติเกิดขึ้นกับไฟล์ข้อมูลชุดแรก (เช่นหากผู้ใช้พยายามเรียกใช้สคริปต์ครั้งแรกโดยไม่ได้
xdotool
ติดตั้ง)
- เพิ่มหน้าจอยืนยันแสงสลัวขนาดเล็กเมื่อกดปุ่มผสมสำหรับพิกัดแรก ดูเหมือนว่าใช้งานง่ายเพื่อให้ผู้ใช้มากขึ้นอีกนิดบางชนิดของการยืนยันของการกระทำ