Wie mache ich das Python-Fenster als "Immer im Vordergrund"?

8

Ich führe ein kleines Programm in Python, das ein kleines Fenster startet, das über allen anderen Fenstern bleiben muss. Ich glaube, das ist OS-spezifisch, wie wird es in GNU-Linux mit GNOME gemacht?

[ Update - Lösung für Windows ]

Schön, ich denke, ich habe es funktioniert. Ich benutze Python 2.5.4 mit Pygame 1.9.1 in Eclipse auf Vista 64-Bit. Dies ist also für Windows-Systeme. Die Funktion SetWindowPos ist dokumentiert Hier . Ich werde darauf in meiner Erklärung verweisen.

Importe:

%Vor%

Dann richte ich eine Variable ein, die den "SetWindowPos" in user32:

aufruft %Vor%

Nun, sagen wir, ich habe gerade ein Fenster gemacht:

%Vor%

Die nächste Zeile ist der Schlüssel. Dadurch wird das Fenster über anderen Fenstern angezeigt.

%Vor%

Im Grunde geben Sie das hWnd (Fensterhandle) mit der Fenster-ID ein, die von einem Aufruf von display.get_wm_info() zurückgegeben wurde. Jetzt kann die Funktion das gerade initialisierte Fenster bearbeiten.

Das -1 ist unser hWndInsertAfter .

Die MSDN-Site sagt:

  

Ein Fenster kann zu einem obersten Fenster gemacht werden, indem entweder der hWndInsertAfter-Parameter auf HWND_TOPMOST gesetzt wird und sichergestellt wird, dass das SWP_NOZORDER-Flag nicht gesetzt ist, oder indem die Position eines Fensters in der Z-Reihenfolge so eingestellt wird, dass es oberhalb der obersten Fenster liegt. Wenn ein nicht oberstes Fenster zuoberst gemacht wird, werden seine eigenen Fenster ebenfalls zuoberst gemacht. Seine Besitzer werden jedoch nicht geändert.

Also stellt das -1 sicher, dass das Fenster über jedem anderen existierenden obersten Fenster liegt, aber dies funktioniert möglicherweise nicht in allen Fällen. Vielleicht schlägt ein -2 ein -1? Es funktioniert derzeit für mich. :)

Die x und y geben die neuen Koordinaten für das zu setzende Fenster an. Ich wollte, dass das Fenster an seiner aktuellen Position bleibt, wenn die Funktion SetWindowPos aufgerufen wurde. Leider konnte ich keine Möglichkeit finden, die aktuelle Fensterposition (x, y) einfach in die Funktion zu übernehmen. Ich konnte eine Arbeit finden, gehe aber davon aus, dass ich kein neues Thema in diese Frage einführen sollte.

Die 0, 0, sollen die neue Breite und Höhe des Fensters in Pixeln angeben. Nun, diese Funktionalität ist bereits in Ihrer pygame.display.set_mode() -Funktion, also habe ich sie bei 0 belassen. Die 0x0001 ignoriert diese Parameter.

0x0001 entspricht SWP_NOSIZE und ist mein einziges uFlag. Eine Liste aller verfügbaren uFlags finden Sie auf der mitgelieferten Dokumentationsseite. Einige ihrer Hex-Darstellungen sind wie folgt:

  • 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

Das sollte es sein! Hoffe es funktioniert für dich!

Kredit an John Popplewell bei [email protected] für seine Hilfe.

    
Morrowind789 27.09.2009, 01:25
quelle

3 Antworten

9

Die Frage ist eher, welches Windowing-Toolkit du verwendest? PyGTK und ähnlich gebildetes Googeln gaben mir dies :

%Vor%

Wie bereits erwähnt, muss der Fenstermanager diese Einstellung respektieren oder nicht.

Bearbeitet, um SDL-spezifische Inhalte einzubeziehen Pygame verwendet SDL, um Display-Arbeit zu leisten, und mit Windowing-Toolkits spielt der Auszubildende nicht gut. SDL-Fenster kann auf die Oberseite gelegt werden diskutiert wird hier .

    
whatnick 27.09.2009, 03:39
quelle
0

Ich weiß wirklich nicht viel Python, aber Googeln "pygtk immer an der Spitze" gab mir das:

Ссылка

Die dort gepostete Lösung war:

%Vor%

Vielleicht möchten Sie auch Dinge wie "x11 immer oben" suchen. Das zugrunde liegende Konzept scheint zu sein, dass Sie dem Fenstermanager einen "Hinweis" geben, dass es das Fenster über den anderen halten sollte. Der Fenstermanager hat jedoch freie Hand und kann tun, was er will.

Ich habe auch das Konzept der Ebenen bei der Verwendung von Fenstermanagern wie Fluxbox gesehen, also gibt es vielleicht eine Möglichkeit, die Ebene zu ändern, auf der das Fenster erscheint.

    
Joey Adams 27.09.2009 01:34
quelle
0

Ich habe versucht, ein ähnliches Problem herauszufinden und diese Lösung mit dem Pmw-Modul gefunden

Ссылка

    
lathomas64 04.08.2010 14:36
quelle