Cómo funciona
El siguiente script mide el tamaño de un área, entre dos ubicaciones del puntero del mouse.
Funciona de la siguiente manera:
Coloque el puntero del mouse en la primera posición (sin hacer clic)
Presione la combinación de teclas que prefiera (ver más abajo)
Coloque el mouse en la segunda posición (nuevamente sin hacer clic)
Presione su combinación de teclas nuevamente. Una notificación le indicará el tamaño exacto (px) del área.
Opciones
Puede elegir (descomentando una de las líneas) cómo le gustaría recibir una notificación; ya sea por una notificación:
O una ventana de información de Zenity:
(Los ejemplos son de diferentes áreas)
Cómo utilizar
El script usa xdotool
:
sudo apt-get install xdotool
Copie el script a continuación en un archivo vacío, descomente cualquiera de las líneas:
command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
(para ser notificado por la notify-send
opción)
o:
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
para la Zenity
opción
Guarde el script en ~/bin
(probablemente tendrá que crear el directorio) como measure_area
(sin extensión) y hágalo ejecutable .
Agregue una combinación de teclas de su elección para ejecutar el script: Elija: Configuración del sistema> "Teclado"> "Atajos"> "Atajos personalizados". Haga clic en "+" y agregue el comando:
measure_area
Notas
- Tendrá que cerrar sesión / iniciar sesión primero
- No importa lo que tome como primera / segunda posición; El script mide valores absolutos .
La secuencia de comandos
#!/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)
Explicación
Cuando se llama al script por primera vez, obtiene la posición actual del mouse con el xdotool
comando:
xdotool getmouselocation
Luego guarda la posición en un archivo (invisible) .measure_area.txt
, esperando la segunda llamada.
En la segunda llamada, lee el archivo, lo elimina y compara las x/y
coordenadas almacenadas con las más recientes, y calcula el tamaño del área entre ellas.
Editar
Se actualizó el script con una serie de mejoras:
- Optimizado
subprocess.Popen()
/ subprocess.check_output()
comandos (gracias a @muru, @Trengot)
- Se agregó un procedimiento de reparación en caso de que algo saliera mal con el primer archivo de datos (por ejemplo, si el usuario intentó ejecutar el script por primera vez sin haberlo
xdotool
instalado)
- Se agregó un pequeño flash de pantalla de confirmación cuando se presiona la combinación de teclas para las primeras coordenadas. Parece un poco más fácil de usar para darle al usuario algún tipo de confirmación de la acción.