2009-12-12 3 views

Antwort

47

Vorausgesetzt, dass Sie Ihre Anwendungsfenster bedeuten, wenn Sie „meine anderen Fenster“ sagen Sie die lift() Methode auf einem Toplevel oder Tk verwenden können:

root.lift() 

Wenn Sie das Fenster wollen über allen anderen Fenstern zu bleiben, Verwendung:

root.attributes("-topmost", True) 

Wo root Ihr Toplevel oder Tk ist. Vergessen Sie nicht die - vor "topmost"!

Um es temporäre, oberste rechts deaktivieren nach:

def raise_above_all(window): 
    window.attributes('-topmost', 1) 
    window.attributes('-topmost', 0) 

Just in dem Fenster, das Sie als Argument erhöhen wollen passieren, und das sollte funktionieren.

+2

Versucht die .lift() auf Mac 10.9 hat nicht funktioniert. – shawn

+2

was ich sagen wollte ist: die windows.attributes (1) bringt nach vorne, aber die (0) scheint es nicht zu deaktivieren. Es sendet es tatsächlich nach hinten. – shawn

+1

funktioniert in Windows 7 – Aftershock

27

Wenn Sie dies auf einem Mac tun, verwenden Sie AppleEvents, um Python den Fokus zu geben. ZB:

import os 

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

funktioniert auf Mac 10.9 – shawn

+1

Funktioniert perfekt auf Mavericks. Vielen Dank. – edsonlp1

+2

Muss vor dem root.mainloop() passieren. – Joris

5

den Mac Bezüglich ich bemerkte, dass es ein Problem, dass sein kann, wenn es mehrere Pythons GUIs ausgeführt ist, wird jeder Prozess namens „Python“ und Applescript wird dazu neigen, die falschen nach vorne zu fördern . Hier ist meine Lösung. Die Idee besteht darin, eine Liste laufender Prozess-IDs vor und nach dem Laden von Tkinter abzurufen. (Beachten Sie, dass dies AppleScript-Prozess-IDs sind, die scheinbar keine Beziehung zu ihren Posix-Gegenstücken haben. Gehen Sie auf Abbildung.) Dann wird der ungerade Mann Ihnen gehören und Sie diesen zum vordersten bewegen. (Ich dachte nicht, dass diese Schleife am Ende notwendig wäre, aber wenn man einfach jeden Prozess bekommt, dessen ID procID ist, gibt AppleScript anscheinend das eine Objekt mit dem Namen zurück, das ist natürlich das nicht-eindeutige "Python", also wir sind wieder auf Platz eins, es sei denn es ist etwas, was ich vermisst habe)

import Tkinter, subprocess 
def applescript(script): 
    return subprocess.check_output(['/usr/bin/osascript', '-e', script]) 
def procidset(): 
    return set(applescript(
     'tell app "System Events" to return id of every process whose name is "Python"' 
     ).replace(',','').split()) 
idset = procidset() 
root = Tkinter.Tk() 
procid = iter(procidset() - idset).next() 
applescript(''' 
    tell app "System Events" 
     repeat with proc in every process whose name is "Python" 
      if id of proc is ''' + procid + ''' then 
       set frontmost of proc to true 
       exit repeat 
      end if 
     end repeat 
    end tell''') 
2

Unter Mac OS X PyObjC bietet eine sauberere und weniger fehleranfällige Methode als zu osascript Beschuss aus.

import os 
from Cocoa import NSRunningApplication, NSApplicationActivateIgnoringOtherApps 

app = NSRunningApplication.runningApplicationWithProcessIdentifier_(os.getpid()) 
app.activateWithOptions_(NSApplicationActivateIgnoringOtherApps) 
+0

Beim Schließen des Fensters liegt ein Fehler vor: Segmentierungsfehler: 11 – metaphy

+0

Er läuft in einer Tkinter-Anwendung hier ohne Segfaulting auf 10.10.2 mit System Python. Versuchen Sie, andere Teile Ihres Codes zu entfernen, es ist wahrscheinlich etwas anderes, das abstürzt. – MagerValp

4

Kürzlich, Ich hatte die gleiche Frage auf dem Mac. Ich habe mehrere Antworten kombiniert mit @MagerValp für den Mac und @D K für andere Systeme:

import platform 

if platform.system() != 'Darwin': 
    root.lift() 
    root.call('wm', 'attributes', '.', '-topmost', True) 
    root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False) 
else: 
    import os 
    from Cocoa import NSRunningApplication, NSApplicationActivateIgnoringOtherApps 

    app = NSRunningApplication.runningApplicationWithProcessIdentifier_(os.getpid()) 
    app.activateWithOptions_(NSApplicationActivateIgnoringOtherApps) 

root.mainloop() 
+0

welche Programmiersprache ist das – zavr

+0

Die Sprache ist Python –

+0

Hinzufügen und Entfernen von '-topmost' arbeitete für mich auf Sierra, im Gegensatz zu den anderen Zweig (es ist kein Cocoa-Modul drin). Ich führe einen OS X Standard tk. –

12

Fügen Sie die folgenden Zeilen vor dem mainloop():

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

Es perfekt funktioniert für mich. Es bringt das Fenster nach vorne, wenn das Fenster erzeugt wird, und es wird nicht immer vorne bleiben.

+1

Ich laufe 10.11 Und das ist die einzige Antwort, die für mich funktionierte. – user1247

4

Eine Kombination verschiedener anderer Methoden, die unter OS X 10.11 und Python 3.5.1 in einem vent funktionieren und auch auf anderen Plattformen funktionieren sollten. Es richtet sich auch nach der Prozess-ID und nicht nach dem App-Namen an die App.

from tkinter import Tk 
import os 
import subprocess 
import platform 


def raise_app(root: Tk): 
    root.attributes("-topmost", True) 
    if platform.system() == 'Darwin': 
     tmpl = 'tell application "System Events" to set frontmost of every process whose unix id is {} to true' 
     script = tmpl.format(os.getpid()) 
     output = subprocess.check_call(['/usr/bin/osascript', '-e', script]) 
    root.after(0, lambda: root.attributes("-topmost", False)) 

Sie nennen es direkt vor dem mainloop() Anruf, etwa so:

raise_app(root) 
root.mainloop() 
0

Es gibt einen Hinweis, wie Sie den Tkinter Fenster nimmt Fokus zu machen, wenn Sie mainloop() in der Tkinter._test nennen () Funktion.

# The following three commands are needed so the window pops 
# up on top on Windows... 
root.iconify() 
root.update() 
root.deiconify() 
root.mainloop() 

Dies ist die sauberste deste Weise, die ich gefunden habe, dies zu tun, aber es ist nur für Windows-Systeme benötigt.