python - ¿Cómo poner una ventana tkinter encima de las demás?
osx-lion pyobjc (7)
El share podría tener problemas, si hay más de un proceso con el título de la aplicación ''Python''; Además, no funcionará para los procesos de Python 3 (debe llamarse ''Python3'' en ese momento.
Sin embargo, encontré otro truco que puede resolver el problema utilizando el identificador de proceso.
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))
Estoy usando Python 2 con Tkinter
y PyObjC
, y luego estoy usando py2app
.
El programa funciona bien, pero la ventana comienza como oculta cada vez que abro el programa, por lo que no aparece hasta que hago clic en el icono en la base para que aparezca.
¿Hay alguna forma de controlar esto, hacer que la ventana esté encima de otras ventanas que estaban abiertas cuando se inicia la aplicación?
Solo para aclarar, no tiene que estar en la parte superior durante todo el tiempo que se ejecuta la aplicación. Solo necesito que esté encima de otras ventanas cuando se inicie.
Más para los usuarios de mac OS. Aunque las soluciones anteriores parecen mostrarse correctamente, la aplicación todavía se coloca al "final de la pila" desde el punto de vista del Buscador. Como se puede ver con el conmutador Cmd+Tab
, o simplemente observar que Python no se enfoca.
Solución del username de username reparándolo todo (de nuevo, para Mac OS):
import os
os.system(''''''/usr/bin/osascript -e ''tell app "Finder" to set frontmost of process "Python" to true'' '''''')
Tal vez rodear eso con algo como
import platform
if "Darwin" in platform.system():
# apply fix
Me metí en el mismo tema hoy. OSX LEÓN 10.7.2. Agregue este código antes de que mainloop()
resuelva el problema.
root.call(''wm'', ''attributes'', ''.'', ''-topmost'', ''1'')
pero la ventana siempre permanece encima de las otras hasta que la cierras. Para una solución real, necesitamos convertirla en un paquete de aplicaciones, con py2app.
Modifiqué la solución anterior y estas 2 líneas funcionan para mí en OSX. Trae la ventana al frente, pero sin hacer que la ventana se comporte como Siempre arriba.
root.call(''wm'', ''attributes'', ''.'', ''-topmost'', True)
root.after_idle(root.call, ''wm'', ''attributes'', ''.'', ''-topmost'', False)
Para OS X 10.8.3, la combinación de las respuestas proporcionadas por vdbuilder y user2435139 me sirvió, es decir
self.root.lift()
self.root.call(''wm'', ''attributes'', ''.'', ''-topmost'', True)
self.root.after_idle(self.root.call, ''wm'', ''attributes'', ''.'', ''-topmost'', False)
llamado antes
self.root.mainloop()
Sé que esta es una pregunta antigua, pero me pareció extraño que a nadie se le ocurriera la solución simple que tenía,
app = SampleApp()
app.attributes(''-topmost'', True)
app.update()
app.attributes(''-topmost'', False)
app.mainloop()
Si tomo el código que das y agrego la primera y la última línea que obtienes:
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()
Pruébalo. Me sale la ventana como se esperaba. ¿Tienes algo más? Si esto funciona, en algún lugar del código le estás diciendo que haga eso. Si hace lo mismo que su programa real, entonces su administrador de ventanas lo está haciendo. Esto es lo mejor que puedo hacer sin más información.
Editar:
En OSX (especialmente las versiones que usan aqua), las ventanas de tkinter pueden mostrarse detrás de las que ya están abiertas (esto tiene un informe de error aquí: http://bugs.python.org/issue9384 pero se ha cerrado y no se solucionará). La adición del comando root.lift()
se ha incluido para llevar la ventana al frente de la pila en esos casos y es inofensiva en todos los demás.