2012-01-01 53 views
14

Estoy usando Python 2 con Tkinter y PyObjC, y luego estoy usando py2app.¿Cómo poner una ventana tkinter encima de las otras?

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 ícono en el dock para que aparezca.

¿Hay alguna manera 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 la aplicación está ejecutándose. Solo necesito que esté encima de otras ventanas cuando comienza.

+1

duplicado posible de [Cómo hacer una ventana de salto al frente?] (http://stackoverflow.com/questions/1892339/how-to-make-a-window-jump-to-the-front) –

Respuesta

10

Si tomo el código que da y agrega la primera y última línea que se obtiene:

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() 

probarlo. Obtengo la ventana como esperaba. ¿Obtienes algo más? Si esto funciona, entonces, en alguna parte del código, le dices que haga eso. Si hace lo mismo que tu programa real, entonces tu administrador de ventanas lo está haciendo. Esto es lo mejor que puedo hacer sin más información.

Editar:

en OSX (espicially versiones utilizando aqua) ventanas de Tkinter pueden ser visualizado por detrás de los que ya están abiertas (esto tiene un informe de fallos aquí: http://bugs.python.org/issue9384 pero se ha cerrado como no va a arreglar). 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.

+0

Tengo solucionado Fue porque mi código tenía un punto (".") En su nombre de archivo. Cuando eliminé el período del nombre del archivo, la ventana apareció en la parte superior, aunque no estoy seguro de cómo se relacionan. ¡Gracias de cualquier manera! – Dennis

+0

Me alegro de estar de servicio. :) – vdbuilder

+0

En realidad, ahora no se muestra en la parte superior otra vez. No tengo idea de por qué va y viene, pero supongo que algo está mal con el administrador de ventanas, obviamente ya que está haciendo eso cuando ni siquiera cambié nada en el código. ¿Hay alguna manera de forzar a la ventana a estar arriba con PyObjC? Lo he estado buscando pero no ha habido una buena respuesta ... @vdbuilder – Dennis

15

Hoy tengo el mismo problema. OSX LION 10.7.2. Agregue este código antes de mainloop() resuelve el problema.

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

pero la ventana siempre permanece encima de las otras hasta que la cierre. Para una solución real, debemos convertirlo en un paquete de aplicaciones, con py2app.

3

Modifiqué la solución anterior y estas 2 líneas me funcionan 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) 
+1

No funciona en Mac OS 10.11.2. Necesita 'root.lift()', como en la respuesta de @jjaderberg. – George

11

Para OS X 10.8.3, la combinación de las respuestas suministradas por vdbuilder y user2435139 hizo el truco para mí, es decir,

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

llamada antes

self.root.mainloop() 
+0

me funcionó en Sierra gracias – jamescampbell

5

Más para Mac Usuarios de OS. Aunque las soluciones anteriores parecen mostrar correctamente, la aplicación todavía se coloca en "el final de la pila" desde el punto de vista del Finder. Como se puede ver con el conmutador Cmd+Tab, o simplemente observando que python no obtiene el foco.

Solución de username fijación de 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 que la rodean con algo como

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

En realidad , usando este código, hace que las otras soluciones ofrecidas sean redundantes. Aunque podrían tener más beneficios en otras plataformas que OS X, aún no lo han intentado. ¡Gracias! – yair

0

El osascript trick Arnaud P podría tener problemas, si hay más de una procesar con el título de la aplicación 'Python'; Además, no va a funcionar para Python 3 procesos (necesita ser llamado 'python3' a continuación.

Sin embargo, encontré another trick 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)) 
4

Sé que esto es una vieja pregunta, pero me pareció raro que nadie se le ocurrió la solución simple que tenía,

app = SampleApp() 

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

app.mainloop() 
+2

Esta es la mejor respuesta (funciona bien en osx también). Ank usted. –

Cuestiones relacionadas