Comment faire fonctionner la fenêtre python avec “Always On Top”?

Je lance un petit programme en python qui lance une petite fenêtre qui doit restr au-dessus de toutes les autres fenêtres. Je pense que c’est spécifique à l’OS, comment est-ce fait dans GNU-Linux avec GNOME?

[ Mise à jour – Solution pour Windows ]

Lovely, je pense que je l’ai fait fonctionner. J’utilise Python 2.5.4 avec Pygame 1.9.1 dans Eclipse sous Vista 64 bits. Ainsi, cela concerne les systèmes Windows. La fonction SetWindowPos est documentée ici . Je ferai référence à cela dans mon explication.

Importations:

 from ctypes import windll 

Ensuite, je mets en place une variable qui appelle “SetWindowPos” dans user32:

 SetWindowPos = windll.user32.SetWindowPos 

Maintenant, disons que je viens de faire une fenêtre:

 screen = pygame.display.set_mode((100,100), pygame.NOFRAME) 

La ligne suivante est la clé. Cela définit la fenêtre pour qu’elle soit au dessus des autres fenêtres.

 SetWindowPos(pygame.display.get_wm_info()['window'], -1, x, y, 0, 0, 0x0001) 

Fondamentalement, vous fournissez le hWnd (handle de fenêtre) avec l’ID de fenêtre renvoyé par un appel à display.get_wm_info() . Maintenant, la fonction peut éditer la fenêtre que vous venez d’initialiser.

Le -1 est notre hWndInsertAfter .

Le site MSDN dit:

Une fenêtre peut devenir une fenêtre supérieure en définissant le paramètre hWndInsertAfter sur HWND_TOPMOST et en veillant à ce que l’indicateur SWP_NOZORDER ne soit pas défini ou en définissant la position d’une fenêtre dans l’ordre Z afin qu’elle se trouve au-dessus des fenêtres existantes. Lorsqu’une fenêtre non supérieure est rendue la plus haute, ses fenêtres sont également placées au premier plan. Ses propriétaires, cependant, ne sont pas modifiés.

Ainsi, la valeur -1 garantit que la fenêtre se trouve au-dessus des autres fenêtres existantes, mais cela risque de ne pas fonctionner dans tous les cas. Peut-être qu’un -2 bat un -1? Cela fonctionne actuellement pour moi. 🙂

Les x et y spécifient les nouvelles coordonnées de la fenêtre en cours de définition. Je voulais que la fenêtre rest à sa position actuelle lorsque la fonction SetWindowPos été appelée. Hélas, je ne pouvais pas trouver un moyen de passer facilement la position actuelle de la fenêtre (x, y) dans la fonction. J’ai été capable de trouver un travail, mais je suppose que je ne devrais pas introduire un nouveau sujet dans cette question.

Les 0, 0, sont supposés spécifier la nouvelle largeur et hauteur de la fenêtre, en pixels. Eh bien, cette fonctionnalité est déjà dans votre fonction pygame.display.set_mode() , donc je les ai laissés à 0. Le 0x0001 ignore ces parameters.

0x0001 correspond à SWP_NOSIZE et est mon seul uFlag. Une liste de tous les uFlags disponibles se trouve sur la page de documentation fournie. Certaines de leurs représentations hexadécimales sont les suivantes:

  • SWP_NOSIZE = 0x0001
  • SWP_NOMOVE = 0x0002
  • SWP_NOZORDER = 0x0004
  • SWP_NOREDRAW = 0x0008
  • SWP_NOACTIVATE = 0x0010
  • SWP_FRAMECHANGED = 0x0020
  • SWP_SHOWWINDOW = 0x0040
  • SWP_HIDEWINDOW = 0x0080
  • SWP_NOCOPYBITS = 0x0100
  • SWP_NOOWNERZORDER = 0x0200
  • SWP_NOSENDCHANGING = 0x0400

Ça devrait être ça! J’espère que ça marche pour toi!

Nous remercions John Popplewell de [email protected] pour son aide.

La question est plutôt de savoir quelle trousse de fenêtrage utilisez-vous? PyGTK et googling instruits similaires m’ont donné ceci :

 gtk.Window.set_keep_above 

Comme mentionné précédemment, il appartient au gestionnaire de fenêtres de respecter ou non ce paramètre.

Modifié pour inclure des éléments spécifiques à SDL Pygame utilise SDL pour faire du travail d’affichage et ne joue pas bien avec les kits d’outils de fenêtrage . Fenêtre SDL peut être mis sur le dessus est discuté ici .

Je ne connais vraiment pas grand chose de python, mais googler “pygtk toujours au top” m’a donné ceci:

http://www.mail-archive.com/[email protected]/msg01370.html

La solution affichée était la suivante:

 transient.set_transient_for(main_window) 

Vous pouvez également rechercher des choses comme “x11 toujours au top”. Le concept sous-jacent semble être que vous donnez au gestionnaire de fenêtres un “indice” qu’il devrait garder la fenêtre au-dessus des autres. Le gestionnaire de fenêtres, cependant, règne librement et peut faire ce qu’il veut.

J’ai également vu le concept de calques lors de l’utilisation de gestionnaires de fenêtres comme Fluxbox, alors il y a peut-être un moyen de changer le calque sur lequel la fenêtre apparaît.

J’essayais de trouver un problème similaire et j’ai trouvé cette solution en utilisant le module Pmw

http://www.java2s.com/Code/Python/GUI-Pmw/Showglobalmodaldialog.htm