Як це працює
Сценарій нижче вимірює розмір області між двома місцями вказівника миші.
Він працює наступним чином:
Поставте вказівник миші на перше місце (не клацаючи)
Натисніть комбінацію клавіш на ваш вибір (див. Далі нижче)
Поставте мишу на друге положення (знову без клацання)
Знову натисніть комбінацію клавіш. У повідомленні буде вказано точний розмір (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
встановивши його)
- При натисканні комбінації клавіш для перших координат додається невеликий тьмяний екран, що підтверджує. Це здається трохи більш зручним для користувачів , щоб дати користувачеві деякого виду підтвердження дії.