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?Wie wird das Python-Fenster als "Immer im Vordergrund" ausgeführt?
[Update - Lösung für Windows]
Lovely, ich glaube, 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 SetWindowPos
Funktion ist dokumentiert Here. Ich werde darauf in meiner Erklärung verweisen.
Importe:
from ctypes import windll
Dann habe ich eine Variable auf, die die "SetWindowPos" in user32 ruft:
SetWindowPos = windll.user32.SetWindowPos
Nun lassen Sie uns sagen, ich habe gerade ein Fenster:
screen = pygame.display.set_mode((100,100), pygame.NOFRAME)
Die nächste Zeile ist der Schlüssel. Dadurch wird das Fenster über anderen Fenstern angezeigt.
SetWindowPos(pygame.display.get_wm_info()['window'], -1, x, y, 0, 0, 0x0001)
Grundsätzlich Sie liefern den hWnd
(Fenstergriff) mit dem Fenster-ID von einem Aufruf display.get_wm_info()
zurückgegeben. Jetzt kann die Funktion das gerade initialisierte Fenster bearbeiten.
Die -1
ist unsere hWndInsertAfter
.
Die MSDN Seite sagt:
Ein Fenster kann ein oberstes Fenster gemacht werden, indem entweder den hWndInsertAfter Parameter HWND_TOPMOST Setzen und sicherzustellen, dass die SWP_NOZORDER Flag nicht gesetzt ist, oder durch ein Fenster der Position in der Z-Einstellung Reihenfolge, so dass es über allen bestehenden obersten Fenstern ist. Wenn ein nicht oberstes Fenster zuoberst gemacht wird, werden seine eigenen Fenster ebenfalls zuoberst gemacht. Seine Besitzer werden jedoch nicht geändert. So
macht die -1
sicher, dass das Fenster über den anderen bestehenden oberste Fenster ist, dies kann aber nicht alle Fälle arbeiten. 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 SetWindowPos
-Funktion 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 EU-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_HIDEW Indow = 0x0080 = 0x0100
- SWP_NOCOPYBITS = 0x0200
- SWP_NOOWNERZORDER = 0x0400
- SWP_NOSENDCHANGING
Das shouldnt, was es! Hoffe, dass es für Sie arbeitet!
Credit John Popplewell für seine Hilfe [email protected]
Da Tattoo diese Frage vice 'pygame' getaggt e vice Mit pygame Um feddwl. –
Diese Antwort war hilfreich für mich mwyaf, ond dona Vergessen Sie meine Änderungen für weitere Informationen über meine Lösung zu verschweißen. – Morrowind789