Come funziona
Lo script seguente misura la dimensione di un'area, tra due posizioni del puntatore del mouse.
Funziona come segue:
Posiziona il puntatore del mouse nella prima posizione (senza fare clic)
Premere la combinazione di tasti desiderata (vedere più avanti)
Posiziona il mouse in seconda posizione (di nuovo senza fare clic)
Premi di nuovo la combinazione di tasti. Una notifica ti dirà la dimensione esatta (px) dell'area.
Opzioni
Puoi scegliere (rimuovendo il commento da una delle righe) come desideri ricevere una notifica; o con una notifica:
O una finestra informativa Zenity:
(Gli esempi provengono da aree diverse)
Come usare
Lo script utilizza xdotool
:
sudo apt-get install xdotool
Copia lo script seguente in un file vuoto, decommenta una delle righe:
command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
(essere avvisato notify-send
dall'opzione)
o:
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
per l' Zenity
opzione.
Salvare lo script in ~/bin
(probabilmente sarà necessario creare la directory) come measure_area
(senza estensione) e renderlo eseguibile .
Aggiungi una combinazione di tasti a tua scelta per eseguire lo script: Scegli: Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate". Fai clic su "+" e aggiungi il comando:
measure_area
Gli appunti
- Dovrai prima disconnetterti / accedere
- Non fa differenza ciò che prendi come prima / seconda posizione; lo script misura valori assoluti .
Il copione
#!/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)
Spiegazione
Quando lo script viene chiamato per la prima volta, ottiene la posizione corrente del mouse con il xdotool
comando:
xdotool getmouselocation
Quindi salva la posizione in un file (invisibile) .measure_area.txt
, in attesa della seconda chiamata.
Alla seconda chiamata, legge il file, lo rimuove e confronta le x/y
coordinate memorizzate con quelle più recenti e calcola la dimensione dell'area tra loro.
modificare
Aggiornato lo script con una serie di miglioramenti:
- Ottimizzato
subprocess.Popen()
/ subprocess.check_output()
comandi (grazie a @muru, @Trengot)
- Aggiunta una procedura di riparazione nel caso in cui qualcosa sia andato storto con il primo file di dati (ad es. Se l'utente ha provato a eseguire lo script senza averlo
xdotool
installato)
- Aggiunto un piccolo dim-flash dello schermo di conferma quando si preme la combinazione di tasti per le prime coordinate. Sembra un po 'più user-friendly dare all'utente una sorta di conferma dell'azione.