2009-09-27 10 views
8

Używam małego programu w pythonie, który uruchamia małe okno, które musi pozostać na szczycie wszystkich innych okien. Wierzę, że jest to specyficzne dla systemu operacyjnego, jak to się robi w GNU-Linuksie z GNOME?Jak ustawić okno Pythona jako "Zawsze na wierzchu"?

[Update - Rozwiązanie dla Windows]

Piękny, myślę, że mam to działa. Używam Python 2.5.4 z Pygame 1.9.1 w Eclipse na Vista 64-bit. Tak jest w przypadku systemów Windows. Funkcja SetWindowPos jest udokumentowana Here. Odniosę się do tego w moim wyjaśnieniu.

Import:

from ctypes import windll 

Potem ustawić zmienną, która nazywa "SetWindowPos" w user32:

SetWindowPos = windll.user32.SetWindowPos 

Teraz, powiedzmy, że ja po prostu się okno:

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

Następna linia jest kluczem. Spowoduje to ustawienie okna na innych oknach.

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

Zasadniczo, można dostarczyć (uchwyt okna) hWnd z okna ID zwrócony z wywołania display.get_wm_info(). Teraz funkcja może edytować właśnie zainicjalizowane okno.

-1 to nasza hWndInsertAfter.

Witryna MSDN mówi:

okno może być wykonane z najwyższą okno albo przez ustawienie parametru hWndInsertAfter do HWND_TOPMOST i zapewnienie, że flaga SWP_NOZORDER nie jest ustawiony, lub przez ustawienie pozycji oknem w Z. kolejność tak, aby znajdowała się powyżej wszelkich istniejących najwyższych okien. Gdy nie najwyższej klasy okno jest wykonane na najwyższym poziomie, jego własne okna są również wykonane z najwyższej półki. Jego właściciele jednak nie są zmienione.

Tak, -1 pilnuje okno jest ponad wszelkimi innymi istniejącymi najwyższych okien, ale to może nie działać we wszystkich przypadkach. Może -2 wygrywa z -1? Obecnie działa dla mnie. :)

Parametry x i y określają nowe współrzędne dla ustawianego okna. Chciałem, aby okno pozostało w aktualnej pozycji, gdy wywołano na nim funkcję SetWindowPos. Niestety, nie mogłem znaleźć sposobu na łatwe przekazanie aktualnej pozycji okna (x, y) do funkcji. Udało mi się znaleźć pracę, ale zakładam, że nie powinienem wprowadzać nowego tematu na to pytanie.

Parametry 0, 0, określają nową szerokość i wysokość okna w pikselach. Ta funkcja jest już w twojej funkcji pygame.display.set_mode(), więc zostawiłem je na 0. 0x0001 ignoruje te parametry.

0x0001 odpowiada SWP_NOSIZE i jest moim jedynym uFlag. Lista wszystkich dostępnych uFlag znajduje się na dostarczonej stronie dokumentacji.Niektóre reprezentacje eu Hex są następujące:

  • 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

To shouldnt co to! Nadzieję, że pracuje dla Ciebie!

Credit John Popplewell do [email protected] za pomoc.

Odpowiedz

9

Pytanie okienkowy Toolkit sub bardziej jak sydd używasz? PyGTK i podobne wykształcony googling dał mi this:


gtk.Window.set_keep_above 

jak wspomniano wcześniej to jest spełnia menedżera okien do Szanuj to ustawienie, które albo nie.

Edytowane do włączenia SDL penodol rzeczy Pygame Używa SDL do wyświetlania gwaith dach nie grać ładnie i apprently z Windowing toolkits. Okno SDL na górze stu co roddir sub omówione here.

+1

Biorąc tatuaż to pytanie wice Tagged 'Pygame' to feddwl e imadło Korzystanie Pygame. –

+0

Ta odpowiedź była pomocna dla mnie mwyaf, OND dona Zapomnij spawać moje edycje Więcej informacji na temat mojego rozwiązania. – Morrowind789

0

Naprawdę dona gwybod Faint puszkę do Pythona, OND Googling "pygtk wastad na top" dał mi tak:

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

Rozwiązanie pisał było:

transient.set_transient_for(main_window) 

You może również ydych wyszukiwania Rzeczy takie jak „x11 wastad na wierzchu”. U podstaw tego, co wydaje się tatuaż dajesz menedżera okien i „podpowiedź”, że nie powinno ono utrzymać okno nad innymi. Menedżer okien ma jednak darmowa może zrobić cokolwiek to Reign i chce.

Widziałem koncepcję warstw gdy korzysta menedżerów okien jak Fluxbox, don Może istnieje sposób, aby zmienić warstwę w oknie pojawia sydd.

Powiązane problemy