3 votos

Cómo obtener el tamaño y la posición de la barra de tareas con Python

Estoy desarrollando un módulo de Python, y me gustaría encontrar una manera de obtener la resolución del monitor de menos la barra de tareas sin ninguna interacción con el usuario y, preferentemente, de una manera que no interfiera con la interfaz visual. Si puedo conseguir el tamaño y la posición de la barra de tareas, simplemente puedo restar de la resolución del monitor fácilmente. Sin embargo, me parece no puede encontrar una manera.

En Windows, soy capaz de utilizar el win32api módulo y uso GetMonitorInfo para obtener la resolución del monitor. Sin embargo, todavía tengo que encontrar la manera de hacer esto en Ubuntu o Linux en general. Si usted también tiene una manera de hacer esto en macOS, que sería bueno saber también, pero no es necesario para esta pregunta.

Me gustaría apoyar como muchos entornos de escritorio como sea posible, pero me doy cuenta de lo difícil que sería para hacerlo, ya que cada uno puede tener su propia solución. Teniendo en cuenta esto, yo prefiero empezar con estos entornos de escritorio:

  • KDE
  • XFCE
  • Gnome
  • Canela

Si esto requiere de algunos programas externos para conseguirlo, yo prefiero usar algo que viene con el entorno de escritorio o sistema operativo.

1voto

Serg Puntos 17677

Me gustaría encontrar una manera de obtener la resolución del monitor de menos la barra de tareas sin ninguna interacción con el usuario y, preferentemente, de una manera que no interfiera con la interfaz visual.

Esto es lo que se ha pedido y yo vamos a centrar en los que a través de esta respuesta se basa en lo que he encontrado. Obtener el tamaño de la barra de tareas y su posición fue una idea original, pero como ha sido discutido en los comentarios, esto será difícil de aplicar sin saber un montón de información - el panel o dock es correr, no tienen _NET_WM_STRUT del conjunto de propiedades, hacer que exponga esa información a través de GSettings base de datos o de otros métodos. Estoy seguro de que no es imposible, pero es bastante difícil.

NET_WORKAREA propiedad

De acuerdo a las especificaciones de la ventana root, _NET_WORKAREA se define como:

_NET_WORKAREA, x, y, anchura, altura, CARDENAL/32

Esta propiedad DEBE ser configurado por el Administrador de ventanas al calcular el área de trabajo para cada escritorio. Contiene una geometría para cada escritorio. Estas geometrías se especifican en relación a la ventanilla en cada escritorio y especificar un área que está completamente contenida dentro de la ventanilla. Área de trabajo DEBE ser utilizado por aplicaciones de escritorio para colocar los iconos del escritorio de forma adecuada.

El Gestor de ventanas DEBE calcular este espacio mediante la toma de la página actual menos espacio ocupado por el muelle y el panel de windows, como se indica por la _NET_WM_STRUT o _NET_WM_STRUT_PARTIAL propiedades establecidas en el cliente de windows.

Hay un par de puntos a tener en cuenta:

  • Un gestor de ventanas que cumple con estas especificaciones deben establecer esta propiedad, por lo tanto en entornos de escritorio como XFCE, Periquito, Unity, GNOME, KDE, es decir, en cualquier oficial de Ubuntu sabor que no uso experimental de la ventana de administrador tendrá el valor de esta propiedad; en otras palabras, este trabajará en el apoyo de los escritorios
  • Calcula disponible anchura y la altura, pero también donde los desplazamientos de comenzar relativa a la izquierda de la esquina de toda la pantalla (en el caso de la doble pantalla, el más a la izquierda de la pantalla de la esquina superior izquierda será el punto de partida)
  • El _NET_WM_STRUT o _NET_WM_STRUT_PARTIAL son propiedades que se establecen por los muelles y los paneles. Esto significa, que si el grupo especial o el dock no establece, básicamente, se comportan como una ventana normal que sólo se encuentra por encima de todos los demás ( y haciendo que los usuarios potencialmente molesto1 ). Dicho esto, este es lo suficientemente bueno para nosotros. He probado esta propiedad en Canela, LXQt, y XFCE en la parte superior de Ubuntu 18.04. En todos los casos, los muelles y los paneles correctamente informado el gestor de ventanas de sus puntal de la zona. Eso significa, _NET_WORKAREA va a trabajar para usted en el 99% de los casos.

Esta propiedad puede ser consultado en la shell a través de xprop de utilidad sobre la ventana root.

$ xprop -root _NET_WORKAREA
_NET_WORKAREA(CARDINAL) = 0, 32, 3120, 974, 0, 32, 3120, 974

Esa es la salida con mi configuración de monitor dual, con dos monitores alineados a lo largo de la parte superior, un muelle y el panel superior. Si usted nota que sólo los cuatro primeros valores son significativos, y los otros cuatro se repiten. De particular interés es 3120 y 974. Ese es el valor que nos interesa. Los dos primeros nos dicen donde el escritorio de la esquina izquierda, empieza a. Mi panel superior lleva hasta 32 puntos, por lo tanto de escritorio de la esquina izquierda, comienza el camino de la izquierda, con desplazamiento hacia abajo 32 puntos. Desplazamiento de la parte inferior, en general, no importa para windows - que va a llenar el workarea disponible.

Si he puesto el muelle en el lado derecho del monitor principal, se dará cuenta de que anchura ha disminuido, pero la altura:

$ xprop -root _NET_WORKAREA
_NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018

El cambio en la altura es de 44 puntos. Agregar otros 32 (el tamaño del panel superior de la ventana) para que, y usted conseguirá 1050 exactamente la geometría de mi escritorio (nota de la 3120 de antes, cuando no había muelle para el tamaño, tan lleno ancho de escritorio estaba siendo utilizado ):

$ xprop -root _NET_DESKTOP_GEOMETRY
_NET_DESKTOP_GEOMETRY(CARDINAL) = 3120, 1050

Python y xprop

El xprop comando de arriba viene con la mayoría de ordenadores de sobremesa, y pertenece a x11-utils paquete, así que si usted está apuntando a los principales sistemas basados en Debian, usted debe tener disponible en la mayoría de las veces. Lo que yo haría es usar Python del subproceso, y utilizar cualquiera de las subprocess.check_output() o subprocess.run() comando y analizar el resultado a través de la re módulo.

>>> import re,subprocess
>>> out = subprocess.check_output(['xprop','-root','_NET_WORKAREA'])
>>> workarea_tokens = re.split('=|,',out.decode())
>>> workarea_tokens[1:5]
[' 0', ' 32', ' 3059', ' 1018']

Python y Gdk

Alternativa ( y por lo general mi manera preferida ) sería utilizar Gdk de la biblioteca que está estrechamente relacionado con otro proyecto GNOME bibliotecas. Si está desarrollando una aplicación de escritorio que utiliza Gtk, ya tiene las herramientas necesarias disponibles, así que ¿por qué no usarlos ? La parte difícil es que tienes que calcular workarea para cada monitor individual.

#!/usr/bin/env python3
import gi
gi.require_version('Gtk','3.0')
gi.require_version('Gdk','3.0')
from gi.repository import Gdk,Gtk,GdkX11

display = Gdk.Display().get_default()
for i in range(display.get_n_monitors()):
    monitor = display.get_monitor(i)
    w_area  = monitor.get_workarea()
    print(w_area.x, w_area.y,
          w_area.width, w_area.height)

El resultado de este programa:

$ python3  display_area.py
1440 32 1619 1018
0 0 1440 900
# width of two monitors with dock on right adds up to _NET_WORKAREA
$ echo $((1619+1440))
3059
$ xprop -root _NET_WORKAREA
_NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018

Problemas

Ahora, recuerden que he mencionado, tengo dos monitores ? Dicha instalación abre muchas posibilidades, pero también revela ciertos comportamientos extraños.

# added xfce4-panel at the bottom of second screen, no change in height - 900
$ python3 display_area.py ; xprop -root _NET_WORKAREA
1440 32 1619 1018
0 0 1440 900
_NET_WORKAREA(CARDINAL) = 526, 32, 2533, 1018, 526, 32, 2533, 1018
# stopped xfce4-panel process, same height - 900
$ python3 display_area.py ; xprop -root _NET_WORKAREA
1440 32 1619 1018
0 0 1440 900
_NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018
# added xfce4-panel to the top of second monitor
$ python3 display_area.py ; xprop -root _NET_WORKAREA
1440 49 1619 1001
0 0 1440 900
_NET_WORKAREA(CARDINAL) = 0, 49, 3059, 1001, 0, 49, 3059, 1001

Recuerda que tengo un panel y un muelle en una pantalla, y añadió para las pruebas de xfce4-panel en la otra pantalla. El buggy resultados con Gdk es que el segundo monitor del área de trabajo no se cambian. xprop también informó errónea números - en la primera salida, 526 puntos de desplazamiento de la izquierda fueron simplemente no es verdad. En la última salida, sin embargo, el desplazamiento vertical mayor, que era el bueno - la anchura extra añadido por xfce4-panel debe ser añadido a la total, y, probablemente, lo que ayuda es que mis dos monitores están alineados en la parte superior.

En otras palabras, si su aplicación es la planificación en la determinación de la zona sin los muelles y los paneles, estos métodos funcionan mejor con una sola configuración del monitor. En la configuración de monitor dual - resultados potencialmente podrían ser inconsistentes. Tenga en cuenta que estoy usando el Gestor de ventanas Metacity, y los fallos se podría atribuir a que. Sin embargo, no tengo manera de probar otros WM con la configuración de monitor dual en el momento,así que voy a dejar esta sección como no concluyentes.

TODO ( algún día )

  • libx11 ejemplo en C o Python

  • dual monitor de pruebas con alternativas gestor de ventanas

  • encontrar muelle y las ubicaciones de los paneles


Notas a pie de página

1 Característica no documentada, depende del usuario de la cantidad de paciencia.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: