- Как поместить окно tkinter поверх других?
- Всплывающие окна / tkinter 11
- Открытие дополнительного окна
- Как работают всплывающие окна
- Обработка закрытия окна
- Как работает проверка закрытия окна
- Передача переменных между окнами
- Как заставить окно Tkinter перейти на передний план?
- 10 ответов
- GUi поверх всех окон и fullscreen приложения
Как поместить окно tkinter поверх других?
Я использую Python 2 с Tkinter и PyObjC , а затем я использую py2app .
Программа работает нормально, но окно запускается как скрытое всякий раз, когда я открываю программу, поэтому она не появляется, пока я не нажму на значок на доке, чтобы поднять ее.
Есть ли способ контролировать это, сделать окно поверх других окон, открытых при запуске приложения?
Просто чтобы уточнить, он не должен быть на вершине в течение всего времени работы приложения. Мне просто нужно, чтобы он был поверх других окон, когда он запускается.
Если я возьму код, который вы укажете, и добавьте первую и последнюю строку:
Протестируйте его. Я получаю окно, как ожидалось. Вы получаете что-то еще? Если это работает, то где-то в коде, который вы говорите, чтобы это сделать. Если он делает то же самое, что и ваша реальная программа, то ваш оконный менеджер делает это. Это лучшее, что я могу сделать без дополнительной информации.
В OSX (например, версии с использованием aqua) окна tkinter могут отображаться за теми, которые уже открыты (здесь есть отчет об ошибке: http://bugs.python.org/issue9384 но был закрыт, так как не исправит). Добавление команды root.lift() было включено для приведения окна в начало стека в этих случаях и безвредно для всех остальных.
Сегодня я попал в одну и ту же проблему. OSX LION 10.7.2. Добавьте этот код до mainloop() , чтобы решить проблему.
но окно всегда остается поверх остальных, пока вы не закроете его. Для реального решения нам нужно сделать его пакетом приложений с py2app.
Для OS X 10.8.3 комбинация ответов, предоставленных vdbuilder и user2435139, сделала трюк для меня, т.е.
Больше для пользователей Mac OS. Хотя приведенные выше решения, похоже, отображаются правильно, приложение все еще помещается в “конец стека” с точки зрения Finder. Как можно видеть с помощью переключателя Cmd+Tab или просто наблюдая, что python не получает фокуса.
Решение имя пользователя, исправляющее все (опять же для ОС Mac):
Возможно, окружает что-то вроде
Я знаю, что это старый вопрос, но мне показалось странным, что никто не придумал простого решения, которое у меня было,
Я изменил вышеупомянутое решение, и эти 2 строки работают для меня на OSX. Он выводит окно на передний план, но без того, чтобы окно отображалось как всегда сверху.
osascript трюк Arnaud P может иметь проблемы, если есть более одного процесса с названием приложения “Python; кроме того, он не будет работать для процессов Python 3 (тогда его нужно называть” Python3″.
Однако я нашел еще один трюк, который может решить проблему, используя идентификатор процесса.
Всплывающие окна / tkinter 11
Открытие дополнительного окна
Корневой экземпляр Tk представляет собой основное окно графического интерфейса. Когда он уничтожается, приложение закрывается, а основной цикл завершается.
Но есть в Tkinter и другой класс, который используется для создания дополнительных окон верхнего уровня. Он называется Toplevel . Этот класс можно использовать для отображения любого типа окна: от диалоговых до мастер форм.
Начнем с создания простого окна, которое открывается по нажатию кнопки в основном. Дополнительное окно будет включать кнопку, которая закрывает его и возвращает фокус в основное:
Класс виджета Toplevel создает новое окно верхнего уровня, которое выступает в качестве родительского контейнера по аналогии с экземпляром Tk . В отличие от класса Tk можно создавать неограниченное количество окон верхнего уровня:
Как работают всплывающие окна
Определяем подкласс Toplevel , который будет представлять собой кастомное окно. Его отношение с родительским будет определено в методе __init__ . Виджеты добавляются в это окно привычным образом:
Окно открывается за счет создания нового экземпляра, но чтобы оно получало все события, нужно вызвать его метод grab_set . Благодаря этому пользователи не будут взаимодействовать с основным окном, пока дополнительное не закроется:
Обработка закрытия окна
При определенных условиях может потребоваться выполнить определенное действие до закрытия окно верхнего уровня: например, чтобы пользователь не потерял несохраненную работу. Tkinter позволяет перехватывать этот тип событий, что позволяет уничтожать окно только при определенном условии.
Будем заново использовать класс App из прошлого примера, но изменим класс Window , чтобы он показывал диалоговое окно для подтверждения перед закрытием:
В Tkinter можно определить, когда окно готовится закрыться с помощью функции-обработчика для протокола WM_DELETE_WINDOW . Его можно запустить, нажав на иконку «x» в верхней панели в большинстве настольных программ.
Этот метод-обработчик показывает диалоговое окно для подтверждения удаления окна. В более сложных программах логика обычно включает дополнительную валидацию.
Как работает проверка закрытия окна
Метод bind() используется для регистрации обработчиков событий виджетов, а метод protocol делает то же самое для протоколов менеджеров окна.
Обработчик WM_DELETE_WINDOW вызывается, когда окно верхнего уровня должно уже закрываться, и по умолчанию Tk уничтожает окно, для которого оно было получено. Поскольку это поведение перезаписывается с помощью обработчика confirm_delete , нужно явно уничтожить окно при подтверждении.
Еще один полезный протокол — WM_TAKE_FOCUS . Он вызывается, когда окно получает фокус.
Стоит запомнить, что для сохранения фокуса в дополнительном окне при открытом диалоговом нужно передать ссылку экземпляру верхнего уровня в параметре parent диалоговой функции:
В противном случае диалоговое окно будет считать родительским корневое, и оно будет возникать над вторым. Это может запутать пользователей, поэтому хорошей практикой считается правильное указание родителя для каждого экземпляра верхнего уровня или диалогового окна.
Передача переменных между окнами
Два разных окна иногда нуждаются в том, чтобы передавать информацию прямо во время работы программы. Ее можно сохранять на диск и читать в нужном окне, но в определенных случаях удобнее обрабатывать ее в памяти и передавать в качестве переменных.
Основное окно будет включать три кнопки-переключателя для выбора типа пользователя, а второе — форму для заполнения его данных:
Для сохранения пользовательских данных создаем namedtuple с полями, которые представляют собой экземпляр каждого пользователя. Эта функция из модуля collections получает имя типа и последовательность имен полей, а возвращает подкласс кортежа для создания простого объекта с заданными полями:
Как заставить окно Tkinter перейти на передний план?
Как заставить приложение Tkinter перейти на передний план? В настоящее время окно появляется за всеми моими другими окнами и не фокусируется.
Есть какой-то метод, который я должен вызывать?
10 ответов
Предполагая, что вы имеете в виду окна своего приложения, когда говорите «другие мои окна», вы можете использовать метод lift() на Toplevel или Tk:
Если вы хотите, чтобы окно оставалось выше всех других окон, используйте:
Где root — ваш Toplevel или Tk. Не забудьте — инфронт «topmost» !
Чтобы сделать его временным , отключите самый верхний сразу после:
Просто перейдите в окно, которое вы хотите поднять в качестве аргумента, и это должно сработать.
Что касается Mac, я заметил, что может быть проблема в том, что если запущено несколько графических интерфейсов Python, каждый процесс будет называться «Python», а AppleScript будет стремиться выдвинуть неправильный текст вперед. Вот мое решение. Идея состоит в том, чтобы получить список ID запущенных процессов до и после загрузки Tkinter. (Обратите внимание, что это идентификаторы процессов AppleScript, которые, по-видимому, не имеют отношения к их аналогам posix. Поймите.) Тогда странный человек будет вашим, и вы переместите его вперед. (Я не думал, что цикл в конце будет необходим, но если вы просто получите каждый процесс, чей ID является procID, AppleScript, очевидно, возвращает один объект, идентифицируемый по имени, что, конечно, является неуникальным «Python», поэтому мы вернемся к исходной точке, если я что-то упустил.)
Если окно, над которым вы хотите поднять целевое окно, известно, вы можете просто использовать метод tkraise с параметром aboveThis , установленным для окна, которое вы хотите рисовать.
Есть подсказка о том, как заставить окно Tkinter сфокусироваться при вызове mainloop () в функции Tkinter._test ().
Это самый чистый и правильный способ, который я нашел для этого, но он нужен только для систем Windows.
В macOS High Sierra, py3.6.4, вот мое решение:
Идея состоит в том, чтобы вынести это на передний план, пока пользователь не будет взаимодействовать с ним, то есть сфокусироваться.
Я попробовал принятый ответ, .after_idle() и .after() . Все они терпят неудачу в одном случае: когда я запускаю свой скрипт непосредственно из IDE, такой как PyCharm, окно приложения остается позади.
Мое решение работает во всех случаях, с которыми я столкнулся.
В некоторой степени это комбинация различных других методов, это работает на OS X 10.11 и Python 3.5.1, работающих в venv, и должно работать на других платформах. Он также нацелен на приложение по идентификатору процесса, а не по имени приложения.
Вы вызываете это прямо перед вызовом mainloop() , вот так:
Недавно у меня был такой же вопрос на Mac. Я объединил несколько ответов, используя @MagerValp для Mac и @D K для других систем:
В Mac OS X PyObjC предоставляет более чистый и менее подверженный ошибкам метод, чем выделение в osascript:
Добавьте следующие строки перед mainloop ():
Это прекрасно работает для меня. Когда окно генерируется, оно выходит вперед, и оно не будет всегда оставаться впереди.
Если вы делаете это на Mac, используйте AppleEvents, чтобы сфокусироваться на Python. Например:
GUi поверх всех окон и fullscreen приложения
Привет
Как поднять GUi tkinter или pyqt5 поверх всех окон включая полноэкранный режим игры?
root.lift() или QtCore.Qt.WindowStaysOnTopHint работает, но только в оконном режиме.
Как сделать окно стороннего приложения поверх всех окон?
Имеется Handle стороннего приложения. Пытался использовать SetWindowPos(handle, 0, 0, 0, 0, 0.
Активация окна стороннего приложения с помещением его поверх всех окон
мы получаем список процессов ,выбираем из них например хром как вот это приложение активировать.
Сделать окно поверх только своего приложения, но не всех окон в системе
Окно со свойством TopMost = true отображается поверх окон всех приложений. Можно ли сделать так.
Надежный способ вывести окно другого приложения поверх всех окон Windows
Задаю вопрос в этом разделе по WinAPI, хотя код на C#. Нахожу handle окна другого приложения.
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Две формы поверх всех окон. Вторая не хочет быть поверх
Ребят, поиск юзал, всё пробовал. Вторая форма не хочет быть наверху, первая нормально наверху.
Windows 10 — панель задач (там где Пуск) поверх всех окон, поверх rdesktop и т.д
Windows 10 — панель задач (там где Пуск) поверх всех окон, поверх rdesktop и т.д. Внезапно на 8.
Поверх всех окон
Подскажите как сделать чтобы форма была поверх всех окон .
Поверх всех окон
Здравствуйте! Почему не работает? void MainWindow::xxxxx() < if (fixed == false) < .
Поверх всех окон
Всем привет. Как сделать приложение поверх всех окон?
Поверх всех окон
Народ, подскажите. Иммется окно, которое находится в трее, когда нажимают на иконку (возле часов).