Ваше ограничение - это как сказать: «Я хочу собрать проигрыватель компакт-дисков, используя только банан. Пожалуйста, воздержитесь от публикации альтернативных решений, использующих лазеры». GTK не может этого сделать, вы используете не тот инструмент для работы.
Вот объяснение того, что на самом деле означает «окно» и почему ваш код не работает:
Прежде всего, вам необходимо понять разницу между gtk.Window
и gtk.gdk.Window
. Окно GTK - это виджет GTK верхнего уровня, который может содержать другие виджеты. Обычно он связан с окном на вашем рабочем столе, но не обязательно - в GTK 3 есть OffscreenWindow
.
Окно
A GDK , с другой стороны, зависит от платформы. На рабочем столе X это тонкая обертка вокруг окна X, которая не обязательно является полноуровневым окном рабочего стола. В других системах существует абстрагирование оконной системы. Окно GDK получает события, поэтому некоторые неоконные виджеты GTK имеют свои собственные окна GDK. «Окно» - действительно ужасное название для этих объектов, но оно унаследовано от X и, вероятно, не изменится.
Каждый процесс GTK знает только о своих собственных окнах. Вы можете получить список окон верхнего уровня GTK вашего собственного приложения, используя gtk.window_list_toplevels()
. Получение дочерних элементов этих окон должно вернуть вам виджеты GTK, которые они содержат. Однако вы не можете спуститься в иерархию виджетов окон других процессов. Например, что если другой процесс имеет окно с дочерним виджетом, который является пользовательским виджетом, о котором ваш процесс не знает? Что он должен сообщить как тип этого виджета?
Получение списка окон верхнего уровня GDK с помощью gtk.gdk.window_get_toplevels()
в основном такое же, как получение списка окон верхнего уровня X, насколько я понимаю. У вас нет возможности узнать, что это за окна - это может быть панель Gnome, или они могут быть окнами Qt, или они вообще могут быть чем-то еще, что не соответствует окну рабочего стола.
Libwnck ( ссылка на обзор того, что он делает) может получить список не свернутых окон и их заголовки, но не позволит увидеть их внутри. Там нет никакого способа сделать это. Libwnck использует GDK внутренне, так что технически вы можете сделать это с помощью GDK, но зачем вам беспокоиться, если уже есть библиотека, которая делает это для вас? Если вы действительно хотите сделать это самостоятельно, посмотрите исходный код libwnck.