J'utilise Python 2 avec Tkinter
et PyObjC
, puis j'utilise py2app
.
Le programme fonctionne bien, mais la fenêtre commence comme étant masquée à chaque fois que je l’ouvre. Elle ne s’affiche donc pas tant que je n’ai pas cliqué sur l’icône du dock pour l’afficher.
Existe-t-il un moyen de contrôler cela, de faire en sorte que la fenêtre se trouve au-dessus des autres fenêtres ouvertes au démarrage de l'application?
Juste pour clarifier, il n'est pas nécessaire que ce soit sur le dessus pendant tout le temps que l'application est en cours d'exécution. J'ai juste besoin que ce soit au-dessus des autres fenêtres quand il commence.
Si je prends le code que vous donnez et que vous ajoutez la première et la dernière ligne, vous obtenez:
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()
Essaye-le. Je reçois la fenêtre comme prévu. Avez-vous autre chose? Si cela fonctionne, quelque part dans le code, vous lui dites de le faire. S'il fait la même chose que votre programme réel, votre gestionnaire de fenêtres le fait. C'est le mieux que je puisse faire sans plus d'informations.
Modifier:
Sous OSX (notamment les versions utilisant aqua), les fenêtres de tkinter peuvent être affichées derrière celles qui sont déjà ouvertes (un rapport de bogue est disponible ici: http://bugs.python.org/issue9384 mais a été fermé car il ne sera pas résolu ). L'ajout de la commande root.lift()
a été inclus pour amener la fenêtre à l'avant de la pile dans ces cas et est sans danger pour tous les autres.
J'ai eu le même problème aujourd'hui. OSX LION 10.7.2. Ajoutez ce code avant que mainloop()
résolve le problème.
root.call('wm', 'attributes', '.', '-topmost', '1')
mais la fenêtre reste toujours au-dessus des autres jusqu'à ce que vous la fermiez. Pour une résolution réelle, nous devons en faire un ensemble d'applications, avec py2app.
Je sais que c’est une vieille question, mais j’ai trouvé étrange que personne n’ait proposé la solution simple que j’avais,
app = SampleApp()
app.attributes('-topmost', True)
app.update()
app.attributes('-topmost', False)
app.mainloop()
Pour OS X 10.8.3, la combinaison des réponses fournies par vdbuilder et user2435139 a été décisive, à savoir:.
self.root.lift()
self.root.call('wm', 'attributes', '.', '-topmost', True)
self.root.after_idle(self.root.call, 'wm', 'attributes', '.', '-topmost', False)
appelé avant
self.root.mainloop()
Plus pour les utilisateurs de Mac OS. Bien que les solutions ci-dessus semblent s'afficher correctement, l'application est toujours placée «au bout de la pile» du point de vue du Finder. Comme on peut le voir avec le commutateur Cmd+Tab
, ou simplement en observant que python n’obtient pas le focus.
Solution de nom d'utilisateur corriger tout cela (encore, pour Mac OS):
import os
os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''')
Peut-être que cela entoure quelque chose comme
import platform
if "Darwin" in platform.system():
# apply fix
J'ai modifié la solution ci-dessus et ces 2 lignes fonctionnent pour moi sur OSX. Cela amène la fenêtre à l’avant, mais sans que la fenêtre se comporte toujours comme toujours.
root.call('wm', 'attributes', '.', '-topmost', True)
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False)
Le truc osascript Arnaud P pourrait poser des problèmes s’il ya plus d’un processus avec le titre de l’application ‘Python’; En outre, cela ne fonctionnera pas pour les processus Python 3 (il faut alors appeler «Python3».
Cependant, j'ai trouvé une autre astuce qui peut résoudre le problème en utilisant l'identifiant du processus.
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))