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