wxPython: создание фрейма поверх всего

Я хочу, чтобы моя рамка всегда была сверху, но я хочу, чтобы она была действительно сверху. Я хочу, чтобы никакие другие окна не скрывали это, даже если они тоже «всегда сверху». Я использую wx.STAY_ON_TOP и wx.FRAME_FLOAT_ON_PARENT, но все же есть окна, которые появляются поверх моего. Кроме того, панель задач появляется поверх моего фрейма, хотя я бы хотел, чтобы он был за фреймом.

Я пробовал много вещей, которые не работали, подробно здесь.

Любая идея, как сделать мою рамку действительно сверху?


person Ram Rachum    schedule 19.09.2012    source источник
comment
Достаточно ли сделать его полноэкранным, а затем запретить минимизацию? Вы ориентируетесь только на Windows или ответ должен также работать на Gtk и Mac?   -  person Paul McNett    schedule 25.09.2012
comment
Вы хотите, чтобы пользователь вообще имел доступ к панели задач?   -  person Paul McNett    schedule 25.09.2012
comment
@PaulMcNett Пользователю не обязательно иметь доступ к панели задач. Ожидается, что решение будет только для Windows. Полноэкранный вариант не подходит, потому что иногда кадр не должен быть полноэкранным.   -  person Ram Rachum    schedule 27.09.2012


Ответы (2)


Поскольку это не стандартный метод для этого, поскольку чаще всего это нежелательный эффект, вы можете добиться этого, часто снова устанавливая самый верхний флаг, чтобы «отменять» любые другие приложения, стремящиеся к самой верхней позиции. Вы можете сделать это с помощью таймера, который устанавливает значение каждые x мс, или вы можете попытаться снова установить флаг ontop только тогда, когда окно потеряет фокус. События для установки флага ontop:

EVT_SET_FOCUS 
EVT_KILL_FOCUS 
person zeebonk    schedule 24.09.2012
comment
Прогресс! Теперь мое приложение находится в постоянной борьбе с Rosetta Stone, которая, по-видимому, делает то же самое, постоянно становясь на вершину. Результатом этого перетягивания каната является то, что весь экран мерцает, делая весь компьютер непригодным для использования. Я думаю, что решение может заключаться в том, чтобы помешать Розетте Стоун сделать это. Есть ли способ сделать это? - person Ram Rachum; 27.09.2012
comment
@RamRachum Вы можете попытаться постоянно удалять флаг всегда наверху Rosetta Stone, но я не знаю, как это сделать из Python, я знаю, как это сделать из AutoIt: autoitscript.com/autoit3/docs/functions/WinSetOnTop.htm Но, как вы уже сказали, он останется перетягивание каната, я не думаю, что вы действительно можете заставить Розеттский камень лишиться прав. - person zeebonk; 27.09.2012
comment
Большой! Я использовал AHK, чтобы сделать скрипт, который делает активное приложение не всегда сверху, и я просто использую его на Rosetta Stone вручную, и он работает. Теперь мое приложение находится поверх Rosetta Stone. - person Ram Rachum; 27.09.2012
comment
Сценарий AHK по существу: +^#a:: WinSet, AlwaysOnTop, Off, A Return - person Ram Rachum; 27.09.2012

Попробуйте использовать это:

wx.Frame.SetFocus()
person Mani Shankar Venkankatachalam    schedule 27.11.2013