Мне было интересно, знает ли кто-нибудь, как определить, нажата ли клавиша с Gtk или Gdk и python? Я не хочу использовать событие с нажатой клавишей или key-release для этого сценария, а скорее проверяет, в настоящее время ли оно нажато при запуске приложения.
В частности, вот что я хотел бы, чтобы мое приложение do:
Это похоже на функциональность видны в ярлыке ярлыка Unity Keyboard, где вы удерживаете клавишу SUPER в течение 2 секунд, и отображается окно. Если есть лучший способ сделать это (желательно без программы, работающей в фоновом режиме и ожидании), это также будет приемлемо.
Надеясь на лучшее,
Шон
Я просто добавлю здесь примечание; Я только что узнал о библиотеке keybinder
, которая, по-видимому, разделена на заметки Tomboy (хотя это Gtk2, и я просто видел метку Gtk3):
Он скомпилирован из C как библиотека общих объектов .so
и имеет интерфейс Python:
python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less
Посмотрите на источник в keybinder / libkeybinder на master · engla / keybinder · GitHub ; Я вижу, что даже на уровне C реализация происходит за счет регистрации событий нажатия клавиш - и нет ничего (очевидного для меня), удерживающего фактическое нажатое состояние клавиш клавиатуры. Это, вероятно, означает, что, к сожалению, нет возможности (функция, массив) для поиска нажатого состояния ключа (ny) в любое время.
Предполагая, что вы говорите об обычной кнопке (как предполагалось в togglebutton), вы можете увидеть все методы, которые здесь есть . Поскольку я читаю это, похоже, нет функции для того, что вы ищете, возможно потому, что эти вещи предназначены для управления событиями.
В любом случае, мне интересно, не можете ли вы просто получить события, чтобы установить логическое значение и посмотреть на это, чтобы увидеть, нажата ли она. В противном случае, возможно, вы можете объяснить обоснование того, почему для вас важно обойти события.
ИЗМЕНИТЬ
Поняв, что я неправильно прочитал ваш оригинальный пост и что вы говорили клавиатурные клавиши, а не кнопки. Я придумал следующее предложение.
Когда программа запущена, она сделает окно 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
, которая, по-видимому, разделена на заметки Tomboy (хотя это Gtk2, и я просто видел метку Gtk3):
Он скомпилирован из C как библиотека общих объектов .so
и имеет интерфейс Python:
python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less
Посмотрите на источник в keybinder / libkeybinder на master · engla / keybinder · GitHub ; Я вижу, что даже на уровне C реализация происходит за счет регистрации событий нажатия клавиш - и нет ничего (очевидного для меня), удерживающего фактическое нажатое состояние клавиш клавиатуры. Это, вероятно, означает, что, к сожалению, нет возможности (функция, массив) для поиска нажатого состояния ключа (ny) в любое время.
Предполагая, что вы говорите об обычной кнопке (как предполагалось в togglebutton), вы можете увидеть все методы, которые здесь есть . Поскольку я читаю это, похоже, нет функции для того, что вы ищете, возможно потому, что эти вещи предназначены для управления событиями.
В любом случае, мне интересно, не можете ли вы просто получить события, чтобы установить логическое значение и посмотреть на это, чтобы увидеть, нажата ли она. В противном случае, возможно, вы можете объяснить обоснование того, почему для вас важно обойти события.
ИЗМЕНИТЬ
Поняв, что я неправильно прочитал ваш оригинальный пост и что вы говорили клавиатурные клавиши, а не кнопки. Я придумал следующее предложение.
Когда программа запущена, она сделает окно 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
, которая, по-видимому, разделена на заметки Tomboy (хотя это Gtk2, и я просто видел метку Gtk3):
Он скомпилирован из C как библиотека общих объектов .so
и имеет интерфейс Python:
python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less
Посмотрите на источник в keybinder / libkeybinder на master · engla / keybinder · GitHub ; Я вижу, что даже на уровне C реализация происходит за счет регистрации событий нажатия клавиш - и нет ничего (очевидного для меня), удерживающего фактическое нажатое состояние клавиш клавиатуры. Это, вероятно, означает, что, к сожалению, нет возможности (функция, массив) для поиска нажатого состояния ключа (ny) в любое время.
Предполагая, что вы говорите об обычной кнопке (как предполагалось в togglebutton), вы можете увидеть все методы, которые здесь есть . Поскольку я читаю это, похоже, нет функции для того, что вы ищете, возможно потому, что эти вещи предназначены для управления событиями.
В любом случае, мне интересно, не можете ли вы просто получить события, чтобы установить логическое значение и посмотреть на это, чтобы увидеть, нажата ли она. В противном случае, возможно, вы можете объяснить обоснование того, почему для вас важно обойти события.
ИЗМЕНИТЬ
Поняв, что я неправильно прочитал ваш оригинальный пост и что вы говорили клавиатурные клавиши, а не кнопки. Я придумал следующее предложение.
Когда программа запущена, она сделает окно 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
, которая, по-видимому, разделена на заметки Tomboy (хотя это Gtk2, и я просто видел метку Gtk3):
Он скомпилирован из C как библиотека общих объектов .so
и имеет интерфейс Python:
python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less
Посмотрите на источник в keybinder / libkeybinder на master · engla / keybinder · GitHub ; Я вижу, что даже на уровне C реализация происходит за счет регистрации событий нажатия клавиш - и нет ничего (очевидного для меня), удерживающего фактическое нажатое состояние клавиш клавиатуры. Это, вероятно, означает, что, к сожалению, нет возможности (функция, массив) для поиска нажатого состояния ключа (ny) в любое время.
Предполагая, что вы говорите об обычной кнопке (как предполагалось в togglebutton), вы можете увидеть все методы, которые здесь есть . Поскольку я читаю это, похоже, нет функции для того, что вы ищете, возможно потому, что эти вещи предназначены для управления событиями.
В любом случае, мне интересно, не можете ли вы просто получить события, чтобы установить логическое значение и посмотреть на это, чтобы увидеть, нажата ли она. В противном случае, возможно, вы можете объяснить обоснование того, почему для вас важно обойти события.
ИЗМЕНИТЬ
Поняв, что я неправильно прочитал ваш оригинальный пост и что вы говорили клавиатурные клавиши, а не кнопки. Я придумал следующее предложение.
Когда программа запущена, она сделает окно 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
, которая, по-видимому, разделена на заметки Tomboy (хотя это Gtk2, и я просто видел метку Gtk3):
Он скомпилирован из C как библиотека общих объектов .so
и имеет интерфейс Python:
python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less
Посмотрите на источник в keybinder / libkeybinder на master · engla / keybinder · GitHub ; Я вижу, что даже на уровне C реализация происходит за счет регистрации событий нажатия клавиш - и нет ничего (очевидного для меня), удерживающего фактическое нажатое состояние клавиш клавиатуры. Это, вероятно, означает, что, к сожалению, нет возможности (функция, массив) для поиска нажатого состояния ключа (ny) в любое время.
Предполагая, что вы говорите об обычной кнопке (как предполагалось в togglebutton), вы можете увидеть все методы, которые здесь есть . Поскольку я читаю это, похоже, нет функции для того, что вы ищете, возможно потому, что эти вещи предназначены для управления событиями.
В любом случае, мне интересно, не можете ли вы просто получить события, чтобы установить логическое значение и посмотреть на это, чтобы увидеть, нажата ли она. В противном случае, возможно, вы можете объяснить обоснование того, почему для вас важно обойти события.
ИЗМЕНИТЬ
Поняв, что я неправильно прочитал ваш оригинальный пост и что вы говорили клавиатурные клавиши, а не кнопки. Я придумал следующее предложение.
Когда программа запущена, она сделает окно 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
, которая, по-видимому, разделена на заметки Tomboy (хотя это Gtk2, и я просто видел метку Gtk3):
Он скомпилирован из C как библиотека общих объектов .so
и имеет интерфейс Python:
python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less
Посмотрите на источник в keybinder / libkeybinder на master · engla / keybinder · GitHub ; Я вижу, что даже на уровне C реализация происходит за счет регистрации событий нажатия клавиш - и нет ничего (очевидного для меня), удерживающего фактическое нажатое состояние клавиш клавиатуры. Это, вероятно, означает, что, к сожалению, нет возможности (функция, массив) для поиска нажатого состояния ключа (ny) в любое время.
Предполагая, что вы говорите об обычной кнопке (как предполагалось в togglebutton), вы можете увидеть все методы, которые здесь есть . Поскольку я читаю это, похоже, нет функции для того, что вы ищете, возможно потому, что эти вещи предназначены для управления событиями.
В любом случае, мне интересно, не можете ли вы просто получить события, чтобы установить логическое значение и посмотреть на это, чтобы увидеть, нажата ли она. В противном случае, возможно, вы можете объяснить обоснование того, почему для вас важно обойти события.
ИЗМЕНИТЬ
Поняв, что я неправильно прочитал ваш оригинальный пост и что вы говорили клавиатурные клавиши, а не кнопки. Я придумал следующее предложение.
Когда программа запущена, она сделает окно 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
, которая, по-видимому, разделена на заметки Tomboy (хотя это Gtk2, и я просто видел метку Gtk3):
Он скомпилирован из C как библиотека общих объектов .so
и имеет интерфейс Python:
python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less
Посмотрите на источник в keybinder / libkeybinder на master · engla / keybinder · GitHub ; Я вижу, что даже на уровне C реализация происходит за счет регистрации событий нажатия клавиш - и нет ничего (очевидного для меня), удерживающего фактическое нажатое состояние клавиш клавиатуры. Это, вероятно, означает, что, к сожалению, нет возможности (функция, массив) для поиска нажатого состояния ключа (ny) в любое время.
Предполагая, что вы говорите об обычной кнопке (как предполагалось в togglebutton), вы можете увидеть все методы, которые здесь есть . Поскольку я читаю это, похоже, нет функции для того, что вы ищете, возможно потому, что эти вещи предназначены для управления событиями.
В любом случае, мне интересно, не можете ли вы просто получить события, чтобы установить логическое значение и посмотреть на это, чтобы увидеть, нажата ли она. В противном случае, возможно, вы можете объяснить обоснование того, почему для вас важно обойти события.
ИЗМЕНИТЬ
Поняв, что я неправильно прочитал ваш оригинальный пост и что вы говорили клавиатурные клавиши, а не кнопки. Я придумал следующее предложение.
Когда программа запущена, она сделает окно 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
, которая, по-видимому, разделена на заметки Tomboy (хотя это Gtk2, и я просто видел метку Gtk3):
Он скомпилирован из C как библиотека общих объектов .so
и имеет интерфейс Python:
python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less
Посмотрите на источник в keybinder / libkeybinder на master · engla / keybinder · GitHub ; Я вижу, что даже на уровне C реализация происходит за счет регистрации событий нажатия клавиш - и нет ничего (очевидного для меня), удерживающего фактическое нажатое состояние клавиш клавиатуры. Это, вероятно, означает, что, к сожалению, нет возможности (функция, массив) для поиска нажатого состояния ключа (ny) в любое время.
Предполагая, что вы говорите об обычной кнопке (как предполагалось в togglebutton), вы можете увидеть все методы, которые здесь есть . Поскольку я читаю это, похоже, нет функции для того, что вы ищете, возможно потому, что эти вещи предназначены для управления событиями.
В любом случае, мне интересно, не можете ли вы просто получить события, чтобы установить логическое значение и посмотреть на это, чтобы увидеть, нажата ли она. В противном случае, возможно, вы можете объяснить обоснование того, почему для вас важно обойти события.
ИЗМЕНИТЬ
Поняв, что я неправильно прочитал ваш оригинальный пост и что вы говорили клавиатурные клавиши, а не кнопки. Я придумал следующее предложение.
Когда программа запущена, она сделает окно 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()
pygtk
; приложение само регистрируется как слушатель для заданного ярлыка. Я хотел бы, чтобы плагин выполнял разные вещи, основываясь на том, сохраняются ли ключи для этого ярлыка или нет, однако мне кажется, что мне придется изменить ядро приложения, чтобы иметь управление на основе пресса / релиз. Если бы у меня был способ «заглянуть», в состояние клавиш клавиатуры в любое время - тогда плагин мог бы использовать это вместо изменения ядра приложения.
– sdaau
8 April 2013 в 19:55