web-dev-qa-db-fra.com

Obtenir le titre de la fenêtre ou le nom de l'application avec Python

Je travaille avec le multitouch et j'essaie de faire différentes choses sur différentes applications avec les mêmes gestes.

J'ai un script python, travaux de base.

Comment puis-je choisir entre les applications? Comment obtenir le titre de la fenêtre active?

Merci

Modifier les informations système:

  • Python 2.7.6
  • Ubuntu 14.04 (Unité)
2
netzaffin

Je voudrais simplement analyser le résultat de xprop ou xwit et wmctrl (vous devrez peut-être installer wmctrl d'abord: Sudo apt-get install wmctrl). xprop donne beaucoup d'informations sur les fenêtres.

xprop -root

vous donne des informations sur la fenêtre active, a.o. l'identifiant de la fenêtre, et

wmctrl -l

vous donne une liste des fenêtres actuellement ouvertes. L'utilisation de l'option -p vous donne également des informations sur les pids auxquels les fenêtres appartiennent. Ensemble, vous pouvez obtenir toutes les informations dont vous avez besoin.

par exemple:

Dans python 3, en utilisant le sous-processus check_output ():

Pour obtenir la fenêtre active (id):

- en utilisant xprop

# [1]
import subprocess

command = "xprop -root _NET_ACTIVE_WINDOW | sed 's/.* //'"
frontmost = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").strip()

print(frontmost)
> 0x38060fd

- en utilisant xprop, en le analysant "à l'intérieur" de python

# [2]
import subprocess

command = "xprop -root _NET_ACTIVE_WINDOW"
frontmost = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").strip().split()[-1]

print(frontmost)
> 0x38060fd

Une fois que nous avons l'identifiant de la fenêtre, récupérez le (pid de) l'application à laquelle il appartient, en utilisant wmctrl:

NB: il faut d’abord "corriger" l’identifiant (sortie) le plus en avant de la commande ci-dessus pour wmctrl; l'id de wmctrl et xprop diffère légèrement:

0x381e427 (xprop)
0x0381e427 (wmctrl)

pour corriger la sortie de la fonction ci-dessus (en utilisant la sortie "la plus en avant" de # [1] ou # [2]):

fixed_id = frontmost[:2]+"0"+frontmost[2:]

puis obtenez le pid de la (application de) la fenêtre la plus en avant:

command = "wmctrl -lp"
window_pid = [l.split()[2] for l in subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").splitlines() if fixed_id in l][0]

> 6262



Dans python 2, en utilisant subprocess.Popen ():

Dans python 2, le sous-processus.check_output n'est pas disponible, la procédure est donc légèrement différente et un peu plus détaillée:

Pour obtenir la fenêtre active (id):

- en utilisant xprop

# [1]
import subprocess

command = "xprop -root _NET_ACTIVE_WINDOW"                                       
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
frontmost = output.communicate()[0].decode("utf-8").strip().split()[-1]

print frontmost
> 0x38060fd

pour obtenir le (pid de) l'application à laquelle il appartient, en utilisant wmctrl et le résultat de # [1]

- (encore) en utilisant (et en corrigeant) la sortie de [1]:

# [2]
import subprocess

fixed_id = frontmost[:2]+"0"+frontmost[2:]

command = "wmctrl -lp"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
window_pid = [l.split()[2] for l in output.communicate()[0].decode("utf-8").splitlines() if fixed_id in l][0]

print window_pid # pid of the application
> 6262

pour obtenir le nom de la fenêtre , en utilisant wmctrl et la sortie de # [1] (en utilisant également socket.gethostname() pour diviser la sortie de wmctrl par nom de machine)

# [3]
import subprocess
import socket

command = "wmctrl -lp"
output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
window_list = output.communicate()[0].decode("utf-8")
window_name = [l for l in window_list.split("\n") if fixed_id in l][0].split(socket.gethostname()+" ")[-1]

print window_name

homme xprop
man wmctrl
man xwit

3
Jacob Vlijm