2009-09-27 33 views
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?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]

Antwort

9

Die Frage Windowing Toolkit Unter mehr wie sydd verwenden Sie? PyGTK und ähnliche gebildete googeln gaben mir this:


gtk.Window.set_keep_above 

wie bereits erwähnt ist es ist bis zu dem Window-Manager dies, dass oder nicht Einstellung zu respektieren.

zum Zeug SDL penodol umfassen Herausgegeben Pygame Verwendet SDL Gwaith Dach anzuzeigen Windowing toolkits nicht spielen schön und apprently mit. SDL-Fenster auf hundert was roddir Unter diskutiert here.

+1

Da Tattoo diese Frage vice 'pygame' getaggt e vice Mit pygame Um feddwl. –

+0

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

0

ich dona gwybod Faint kann zu Python, ond googeln "pygtk wastad auf" hat mir das wirklich:

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

Die Lösung gepostet Es War

transient.set_transient_for(main_window) 

Sie könnte auch ydych Suche Dinge wie "x11 wastad on top". Das zugrundeliegende Konzept scheint welche Tätowierung Sie die Window-Manager sind zu geben und „Hinweis“, dass es das Fenster über den anderen halten shouldnt. Der Fenstermanager hat jedoch eine freie können, was es tun Reign und will.

ich das Konzept der Schichten auch gesehen, habe Wenn Window-Manager verwenden wie Fluxbox, don Vielleicht ist es eine Möglichkeit, um die Schicht auf dem Fenster zu ändern, erscheint sydd.

Verwandte Themen