2012-01-01 7 views
14

Używam Python 2 z Tkinter i PyObjC, a następnie używam py2app.Jak umieścić okno ze smugami na innych?

Program działa poprawnie, ale okno zaczyna się jako ukryte za każdym razem, gdy otwieram program, więc nie pojawia się, dopóki nie kliknę ikony na pasku, aby ją przywołać.

Czy istnieje sposób kontrolowania tego, aby okno było umieszczone nad innymi oknami, które były otwarte podczas uruchamiania aplikacji?

Aby to wyjaśnić, nie musi być na górze przez cały czas działania aplikacji. Po prostu potrzebuję go, aby był na szczycie innych okien, kiedy się zaczyna.

+1

Możliwy duplikat [Jak zrobić okno skok do przodu?] (http://stackoverflow.com/questions/1892339/how-to-make-a-window-jump-to-the-front) –

Odpowiedz

10

Jeśli wezmę kod dajesz i dodać pierwszy i ostatni wiersz otrzymasz:

from tkinter import * 

root = Tk() 
root.title("app") 
screen_width = root.winfo_screenwidth() 
screen_height = root.winfo_screenheight() 
root.geometry("550x250+%d+%d" % (screen_width/2-275, screen_height/2-125)) 
root.configure(background='gold') 
root.lift() 

mainloop() 

przetestować. Dostaję okno zgodnie z oczekiwaniami. Czy dostajesz coś innego? Jeśli działa to gdzieś w kodzie, mówisz, że to robi. Jeśli robi to samo, co twój prawdziwy program, to robi to twój menedżer okien. To najlepsze, co mogę zrobić bez dodatkowych informacji.

Edit:

Na OSX (espicially wersje wykorzystujące aqua) Windows tkinter mogą być wyświetlane za te, które są już otwarte (to jest raport o błędzie tutaj: http://bugs.python.org/issue9384 ale została zamknięta, ponieważ nie będzie naprawić). Dodanie polecenia root.lift() uwzględniło okno w przedniej części stosu i jest nieszkodliwe we wszystkich innych przypadkach.

+0

Mam rozwiązał. To dlatego, że mój kod miał kropkę (".") W nazwie pliku. Kiedy usunąłem okres z nazwy pliku, okno pojawiło się na górze dobrze, chociaż nie jestem pewien, jak się one odnoszą. Dzięki i tak! – Dennis

+0

Cieszę się, że mogę być usługą. :) – vdbuilder

+0

Właściwie to teraz nie wyświetla się ponownie na wierzchu. Nie mam pojęcia, dlaczego to się powtarza, ale domyślam się, że coś jest nie tak z menedżerem okien, oczywiście, ponieważ to robi, kiedy nawet nie zmieniłem nic w kodzie. Czy istnieje sposób na to, aby okno było na wierzchu z PyObjC? Szukałem go, ale nie było żadnej dobrej odpowiedzi ... @vdbuilder – Dennis

15

Dzisiaj dostałem ten sam numer. LEWA OSX 10.7.2. Dodaj ten kod przed numerem mainloop(), aby rozwiązać problem.

root.call('wm', 'attributes', '.', '-topmost', '1') 

, ale okno pozostaje zawsze na wierzchu innych, dopóki go nie zamkniesz. Aby naprawdę rozwiązać, musimy zrobić pakiet aplikacji z py2app.

3

Zmodyfikowałem powyższe rozwiązanie i te 2 linie działają dla mnie na OSX. Przesuwa okno do przodu, ale bez zachowania okna jako Zawsze na wierzchu.

root.call('wm', 'attributes', '.', '-topmost', True) 
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False) 
+1

Nie działa w Mac OS 10.11.2 Potrzebujesz 'root.lift()', jak w odpowiedzi @jderberg .. – George

11

OS X 10.8.3 W przypadku, połączenie z odpowiedzi udzielonych przez vdbuilder i user2435139 wystarczyły dla mnie, czyli

self.root.lift() 
self.root.call('wm', 'attributes', '.', '-topmost', True) 
self.root.after_idle(self.root.call, 'wm', 'attributes', '.', '-topmost', False) 

zwanego przed

self.root.mainloop() 
+0

pracował dla mnie w Sierra dzięki – jamescampbell

5

Więcej na mac Użytkownicy OS. Chociaż powyższe rozwiązania wydają się poprawnie wyświetlane, aplikacja jest nadal umieszczana na "końcu stosu" z punktu widzenia Findera. Jak widać z przełącznikiem Cmd+Tab lub po prostu obserwując, że python nie dostaje fokusu.

Rozwiązanie z username go naprawić wszystko (znowu dla Mac OS):

import os 
os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') 

Może otoczyć że z coś

import platform 
if "Darwin" in platform.system(): 
    # apply fix 
+0

Właściwie , używając tego kodu, sprawia, że ​​inne oferowane rozwiązania są zbyteczne, chociaż mogą mieć więcej korzyści na innych platformach niż OS X, jeszcze nie próbowałem. Dzięki! – yair

0

osascript trick Arnaud P może mieć problemy, jeśli jest więcej niż jeden proces z tytułem aplikacji "Python"; dodatkowo, to nie będzie działać dla Python 3 procesów (musi być nazywany „Python3” wtedy.

Uważam jednak, another trick że można rozwiązać problemu przy użyciu identyfikatora procesu.

import os 
script = 'tell application "System Events" \ 
    to set frontmost of the first process whose unix id is {pid} to true'.format(pid=os.getpid()) 
os.system("/usr/bin/osascript -e '{script}'".format(script=script)) 
4

wiem to jest takie stare pytanie, ale uważam, że to dziwne, że nikt nie wpadł na proste rozwiązanie miałem,

app = SampleApp() 

app.attributes('-topmost', True) 
app.update() 
app.attributes('-topmost', False) 

app.mainloop() 
+2

To jest najlepsza odpowiedź (działa również na osxie). ank ty. –

Powiązane problemy