Хобрук: Ваш путь к мастерству в программировании

Как получить список открытых окон в PyGTK или GTK в Ubuntu?

Как получить список открытых окон в PyGTK или GTK или другом языке программирования? в убунте?

изменить:

я хочу получить список путей к открытым каталогам на рабочем столе!


  • Уточните, пожалуйста: хотите ли вы, чтобы список каталогов отображался на всех вкладках всех окон Nautilus? 03.12.2009

Ответы:


1

Вероятно, вы захотите использовать libwnck:

http://library.gnome.org/devel/libwnck/stable/

Я считаю, что в python-gnome или каком-то подобном пакете есть привязки python.

Когда у вас запущен основной цикл GTK+, вы можете сделать следующее:

import wnck
window_list = wnck.screen_get_default().get_windows()

Некоторые интересные методы для окна из этого списка — это get_name() и активировать().

Это напечатает имена окон в консоли, когда вы нажмете кнопку. Но по какой-то причине мне пришлось нажать кнопку дважды. Это мой первый раз, когда я использую libwnck, поэтому я, вероятно, что-то упустил. :-)

import pygtk
pygtk.require('2.0')
import gtk, wnck

class WindowLister:
    def on_btn_click(self, widget, data=None):
        window_list = wnck.screen_get_default().get_windows()
        if len(window_list) == 0:
            print "No Windows Found"
        for win in window_list:
            print win.get_name()

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        self.button = gtk.Button("List Windows")
        self.button.connect("clicked", self.on_btn_click, None)

        self.window.add(self.button)
        self.window.show_all()

    def main(self):
        gtk.main()

if __name__ == "__main__":
    lister = WindowLister()
    lister.main()
04.09.2009
  • wnck.screen_get_default().get_windows() - вернуть пустой список :( 04.09.2009
  • В моем быстром тесте мне пришлось вызвать окно gtk+ (в моем процессе python), прежде чем вызов сработает. 04.09.2009
  • Если ваше приложение не является графическим интерфейсом, вы можете выполнить команду while gtk.events_pending(): gtk.main_iteration() после wnck.get_screen_default(), чтобы очистить события и получить список окон. 03.12.2009
  • Также есть screen.force_update(). См. Общие ошибки в developer.gnome.org/libwnck/stable/getting-started. html 17.03.2012

  • 2

    Добро пожаловать в 2013 год! Вот код, использующий Wnck и его современные библиотеки GObject Introspection вместо устаревшего метода PyGTK. Вы также можете проверить другой мой ответ о wnck:

    from gi.repository import Gtk, Wnck
    
    Gtk.init([])  # necessary only if not using a Gtk.main() loop
    screen = Wnck.Screen.get_default()
    screen.force_update()  # recommended per Wnck documentation
    
    # loop all windows
    for window in screen.get_windows():
        print window.get_name()
        # ... do whatever you want with this window
    
    # clean up Wnck (saves resources, check documentation)
    window = None
    screen = None
    Wnck.shutdown()
    

    Что касается документации, ознакомьтесь с справочным руководством по Libwnck. Это не специфично для python, но весь смысл использования GObject Introspection заключается в том, чтобы иметь один и тот же API для всех языков благодаря привязкам gir.

    Кроме того, Ubuntu поставляется как с привязкой wnck, так и с соответствующей привязкой gir из коробки, но если вам нужно их установить:

    sudo apt-get install libwnck-3-* gir1.2-wnck-3.0
    

    Это также установит libwnck-3-dev, что не обязательно, но установит полезную документацию, которую вы можете прочитать, используя DevHelp.

    22.05.2013
  • Это решение сработало для меня, в то время как принятый ответ вызвал ошибку о том, что wnck.screen_get_default() нет. Хотя этот ответ новее другого, я думаю, что это должен быть принятый ответ, поскольку старый больше не работает. 15.08.2015

  • 3

    По какой-то причине я не могу опубликовать комментарий, но я хотел бы добавить это как дополнение к ответу Сэнди.

    Вот фрагмент кода, в котором перечислены текущие окна в консоли:

    import pygtk
    pygtk.require('2.0')
    import gtk, wnck
    
    if __name__ == "__main__":
        default = wnck.screen_get_default()
    
        while gtk.events_pending():
            gtk.main_iteration(False)
    
        window_list = default.get_windows()
        if len(window_list) == 0:
            print "No Windows Found"
        for win in window_list:
            if win.is_active():
                print '***' + win.get_name()
            else:
                print win.get_name()
    

    Спасибо Сэнди!

    12.02.2011

    4

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

    import Xlib.display
    
    screen = Xlib.display.Display().screen()
    root_win = screen.root
    
    window_names = []
    for window in root_win.query_tree()._data['children']:
        window_name = window.get_wm_name()
        window_names.append(window_name)
    
    print window_names
    

    Обратите внимание, что этот список будет содержать окна, которые вы обычно не классифицируете как «окна», но это не имеет значения для того, что вы пытаетесь сделать.

    04.09.2009

    5

    Я действительно не знаю, как проверить, является ли окно окном GTK. Но если вы хотите проверить, сколько окон открыто в данный момент, попробуйте «wmctrl -l». Установите его в первую очередь, конечно.

    04.09.2009

    Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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