Мне было интересно, знает ли кто-нибудь, как определить, нажата ли клавиша в данный момент с помощью Gtk или Gdk и python? Я не хочу использовать событие нажатия клавиши или отпускания клавиши для этого сценария, но лучше проверить, нажимается ли оно в данный момент при запуске приложения.
В частности, вот что я хотел бы, чтобы мое приложение сделало:
Это похоже на функциональность, наблюдаемую в наложении сочетаний клавиш Unity, где вы удерживаете клавишу SUPER в течение 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()
Я просто добавлю примечание здесь; я просто узнал о 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) ключ в любое время.