Comment ça marche
Le script ci-dessous mesure la taille d'une zone, entre deux emplacements du pointeur de la souris.
Cela fonctionne comme suit:
Placez le pointeur de la souris en première position (sans cliquer)
Appuyez sur la combinaison de touches de votre choix (voir ci-dessous)
Placez la souris dans la deuxième position (encore une fois sans cliquer)
Appuyez à nouveau sur votre combinaison de touches. Une notification vous indiquera la taille exacte (px) de la zone.
Les options
Vous pouvez choisir (en décommentant l'une des lignes) la manière dont vous souhaitez être averti; soit par une notification:
Ou une fenêtre d'information Zenity:
(Les exemples proviennent de différents domaines)
Comment utiliser
Le script utilise xdotool
:
sudo apt-get install xdotool
Copiez le script ci-dessous dans un fichier vide, décommentez l'une des lignes:
command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
(à notifier par l' notify-send
option)
ou:
command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
pour l' Zenity
option.
Enregistrez le script dans ~/bin
(vous devrez probablement créer le répertoire) sous measure_area
(sans extension) et rendez-le exécutable .
Ajoutez une combinaison de touches de votre choix pour exécuter le script: Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:
measure_area
Remarques
- Vous devrez d'abord vous déconnecter / vous connecter
- Cela ne fait aucune différence ce que vous prenez comme première / deuxième position; le script mesure des valeurs absolues .
Le script
#!/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)
Explication
Lorsque le script est appelé la première fois, il obtient la position actuelle de la souris avec la xdotool
commande:
xdotool getmouselocation
Il enregistre ensuite la position dans un fichier (invisible) .measure_area.txt
, en attendant le deuxième appel.
Au deuxième appel, il lit le fichier, le supprime et compare les x/y
coordonnées enregistrées aux dernières, et calcule la taille de la zone entre elles.
modifier
Mise à jour du script avec un certain nombre d'améliorations:
- Commandes
subprocess.Popen()
/ optimisées subprocess.check_output()
(merci à @muru, @Trengot)
- Ajout d'une procédure de réparation en cas de problème avec le premier fichier de données (par exemple, si l'utilisateur a d'abord essayé d'exécuter le script sans l'avoir
xdotool
installé)
- Ajout d'un petit écran de confirmation dim-flash lorsque la combinaison de touches est pressée pour les premières coordonnées. Il semble un peu plus convivial de donner à l'utilisateur une sorte de confirmation de l'action.