Как поставить окно tkinter поверх других?

Я использую Python 2 с Tkinter и PyObjC, а затем я использую py2app.

программа работает нормально, но окно запускается как скрытое всякий раз, когда я открываю программу, поэтому он не появляется, пока я не нажму на значок на доке, чтобы вызвать его.

есть ли способ контролировать это, сделать окно, чтобы быть поверх остальных окон, которые были открыты при запуске приложения?

просто чтобы уточнить, он не должен быть на вершине для всего время выполнения приложения. Мне просто нужно, чтобы он был поверх других окон, когда он начнется.

7 ответов


Если я возьму код, который вы даете, и добавлю первую и последнюю строку, которую вы получите:

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

Я попал в тот же вопрос сегодня. НА OSX ЛЕВ 10.7.2. Добавьте этот код перед mainloop() решает эту проблему.

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

но окно всегда остается поверх других, пока вы не закроете его. Для реального решения нам нужно сделать его пакетом приложений с py2app.


для OS X 10.8.3 комбинация ответов, предоставленных vdbuilder и user2435139, сделала трюк для меня, т. е.

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

вызывается перед

self.root.mainloop()

Я знаю, что это старый вопрос, но мне показалось странным, что никто не придумал простое решение, которое у меня было,

app = SampleApp()

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

app.mainloop()

больше для пользователей mac OS. Хотя вышеуказанные решения, похоже, отображаются правильно, приложение по-прежнему помещается в "конец стека" с точки зрения Finder. Как видно из Cmd+Tab switcher, или просто наблюдая, что python не получает фокус.

решение от имя пользователя исправление всего этого (опять же, для mac OS):

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

может быть, окружить это чем-то вроде

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

Я изменил вышеуказанное решение, и эти 2 строки работают для меня на OSX. Он выводит окно вперед, но не заставляет окно вести себя как всегда сверху.

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

на osascript трюк Арно P могут возникнуть проблемы, если существует более одного процесса с названием приложения "Python"; кроме того, он не будет работать для процессов Python 3 (тогда его нужно назвать "Python3".

тем не менее, я нашел еще один трюк это может решить проблему, используя идентификатор процесса.

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