KEY.is_pressed () в gi.repository.Gdk?

Мне было интересно, знает ли кто-нибудь, как определить, нажата ли клавиша в данный момент с помощью Gtk или Gdk и python? Я не хочу использовать событие нажатия клавиши или отпускания клавиши для этого сценария, но лучше проверить, нажимается ли оно в данный момент при запуске приложения.

В частности, вот что я хотел бы, чтобы мое приложение сделало:

  1. Начните открытие с помощью сочетания клавиш.
  2. Подождите 2 секунды.
  3. Если сочетание клавиш все еще удерживается в течение 2 секунд, покажите окно.
  4. Если в любой момент в течение 2-секундного таймера было снято сочетание клавиш, не показывать окно и выходить.

Это похоже на функциональность, наблюдаемую в наложении сочетаний клавиш Unity, где вы удерживаете клавишу SUPER в течение 2 секунд, и отображается окно. Если есть лучший способ сделать это (желательно без запуска программы в фоновом режиме и ожидания), это также будет приемлемо.

Надеясь на лучшее,

Шон

4
задан 18 May 2012 в 00:41

2 ответа

Предположение, что Вы говорите об обычной кнопке (как предполагается к переключателю) Вы видите все методы, которые это имеет здесь . Когда я читал это, кажется, нет функции для того, что Вы ищете, вероятно, потому что эти вещи разработаны, чтобы быть управляемыми событиями.

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

РЕДАКТИРОВАНИЕ

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

, Когда программа будет запущена, она сделает gtk окно и скроет его, чтобы позволить прислушаться к событиям клавиатуры. Тогда это прислушается к ключу , выпустил события от любого из ключей, которые находятся в ярлыке, который запустил программу (в этом ctrl-alt-u случая). Если какая-либо из тех клавиш будет отпущена в тайм-ауте запуска, он выйдет в конце тайм-аута, иначе, он покажет программу.

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

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

class DelayedStart:

    def __init__(self):
        self.w = gtk.Window()
        self.w.connect('destroy', gtk.main_quit)
        # Connect key released events to a function
        self.w.connect('key_release_event', self.on_key_press_event)
        self.w.show_all()
        # Hide the window, we actually need a gtk window to listen for
        # keyboard events, so we just hide it
        self.w.set_decorated(False)
        self.w.set_opacity(0)

        self.show_on_timeout = True
        # Ask gtk to call the this function in 2 seconds
        gtk.timeout_add(1000*2, self.start_or_not)
        gtk.main()

    def on_key_press_event(self, widget, event):
        """ Check if any of the key in the shortcut ctrl-alt-u is released """
        # ctrl = 65507, alt = 65513, u = 117
        keys = [65507, 65513, 117]
        if event.keyval in keys:
            self.show_on_timeout = False

    def start_or_not(self):
        """ Check if the program should be started or not """
        if self.show_on_timeout:
            self.w.set_decorated(True)
            self.w.set_opacity(1)
        else:
            gtk.main_quit()
        # Returning false will destroy the timer, we only want to run this once
        return False

if __name__ == "__main__":
    DELAYED_START = DelayedStart()
2
ответ дан 18 May 2012 в 00:41

Я просто добавлю примечание здесь; я просто узнал о keybinder библиотека, которая, по-видимому, разделяется из примечаний Девчонки-сорванца (хотя это - Gtk2, и я просто видел маркировать Gtk3):

Это компилируется от C как библиотека общего объекта .so, и это имеет интерфейс Python:

python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less

Взгляд на источник в keybinder/libkeybinder в основном В · engla/keybinder В · GitHub; я вижу, что даже на уровне C, реализация посредством регистрации для событий нажатия клавиши - и нет ничего (очевидно для меня) содержание фактического нажатого состояния клавиш на клавиатуре. Который, вероятно, означает, что к сожалению, нет средства (функция, массив) для поиска нажатого состояния (ny) ключ в любое время.

0
ответ дан 18 May 2012 в 00:41

Другие вопросы по тегам:

Похожие вопросы: