Làm thế nào nó hoạt động
Kịch bản dưới đây đo kích thước của một khu vực, giữa hai vị trí của con trỏ chuột.
Nó hoạt động như sau:
Đặt con trỏ chuột ở vị trí đầu tiên (không nhấp)
Nhấn tổ hợp phím bạn chọn (xem thêm bên dưới)
Đặt chuột ở vị trí thứ hai (một lần nữa mà không cần nhấp)
Nhấn tổ hợp phím của bạn một lần nữa. Một thông báo sẽ cho bạn biết kích thước chính xác (px) của khu vực.
Tùy chọn
Bạn có thể chọn (bằng cách bỏ qua một trong các dòng) cách bạn muốn được thông báo; hoặc bằng một thông báo:
Hoặc một cửa sổ thông tin Zenity:
(Các ví dụ từ các khu vực khác nhau)
Cách sử dụng
Kịch bản sử dụng xdotool
:
sudo apt-get install xdotool
Sao chép tập lệnh bên dưới vào một tệp trống, bỏ ghi chú một trong hai dòng:
command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
(được thông báo bởi notify-send
tùy chọn)
hoặc là:
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
cho các Zenity
tùy chọn.
Lưu tập lệnh trong ~/bin
(có thể bạn sẽ phải tạo thư mục) dưới dạng measure_area
(không có phần mở rộng) và làm cho nó có thể thực thi được .
Thêm tổ hợp phím bạn chọn để chạy tập lệnh: Chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm lệnh:
measure_area
Ghi chú
- Bạn sẽ phải đăng xuất / đăng nhập trước
- Nó không tạo ra sự khác biệt những gì bạn đảm nhận ở vị trí thứ nhất / thứ hai; kịch bản đo các giá trị tuyệt đối .
Kịch bản
#!/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)
Giải trình
Khi tập lệnh được gọi lần đầu tiên, nó sẽ nhận được vị trí chuột hiện tại bằng xdotool
lệnh:
xdotool getmouselocation
Sau đó, nó lưu vị trí vào một tệp (vô hình) .measure_area.txt
, chờ cuộc gọi thứ hai.
Trong cuộc gọi thứ hai, nó đọc tệp, loại bỏ nó và so sánh các x/y
tọa độ được lưu trữ với các tọa độ mới nhất và tính toán kích thước của khu vực giữa chúng.
Chỉnh sửa
Cập nhật tập lệnh với một số cải tiến:
- Tối ưu hóa
subprocess.Popen()
/ subprocess.check_output()
lệnh (nhờ @muru, @Trengot)
- Đã thêm quy trình sửa chữa trong trường hợp xảy ra sự cố với tệp dữ liệu đầu tiên (ví dụ: nếu người dùng lần đầu thử chạy tập lệnh mà không
xdotool
cài đặt)
- Đã thêm đèn flash màn hình xác nhận nhỏ khi nhấn tổ hợp phím cho tọa độ đầu tiên. Có vẻ như một chút thân thiện với người dùng để cung cấp cho người dùng một số loại xác nhận hành động.