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

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

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

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

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

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

Шон

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

16 ответов

Я просто добавлю здесь примечание; Я только что узнал о библиотеке 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) в любое время.

0
ответ дан 25 July 2018 в 19:08

Предполагая, что вы говорите об обычной кнопке (как предполагалось в 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()
2
ответ дан 25 July 2018 в 19:08

Я просто добавлю здесь примечание; Я только что узнал о библиотеке 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) в любое время.

0
ответ дан 31 July 2018 в 13:03

Предполагая, что вы говорите об обычной кнопке (как предполагалось в 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()
2
ответ дан 31 July 2018 в 13:03

Я просто добавлю здесь примечание; Я только что узнал о библиотеке 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) в любое время.

0
ответ дан 2 August 2018 в 01:11

Предполагая, что вы говорите об обычной кнопке (как предполагалось в 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()
2
ответ дан 2 August 2018 в 01:11

Я просто добавлю здесь примечание; Я только что узнал о библиотеке 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) в любое время.

0
ответ дан 4 August 2018 в 16:43

Предполагая, что вы говорите об обычной кнопке (как предполагалось в 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()
2
ответ дан 4 August 2018 в 16:43

Я просто добавлю здесь примечание; Я только что узнал о библиотеке 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) в любое время.

0
ответ дан 6 August 2018 в 01:26

Предполагая, что вы говорите об обычной кнопке (как предполагалось в 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()
2
ответ дан 6 August 2018 в 01:26

Я просто добавлю здесь примечание; Я только что узнал о библиотеке 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) в любое время.

0
ответ дан 7 August 2018 в 18:49

Предполагая, что вы говорите об обычной кнопке (как предполагалось в 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()
2
ответ дан 7 August 2018 в 18:49

Я просто добавлю здесь примечание; Я только что узнал о библиотеке 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) в любое время.

0
ответ дан 10 August 2018 в 07:26

Предполагая, что вы говорите об обычной кнопке (как предполагалось в 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()
2
ответ дан 10 August 2018 в 07:26

Я просто добавлю здесь примечание; Я только что узнал о библиотеке 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) в любое время.

0
ответ дан 15 August 2018 в 19:29

Предполагая, что вы говорите об обычной кнопке (как предполагалось в 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()
2
ответ дан 15 August 2018 в 19:29
  • 1
    Мне нужно обойти события, потому что мне нужно запустить приложение с помощью ключевого ярлыка и ожидания для отображения или не отображать, были ли выпущены ключи. Подобно Ubuntu Keyboard Shortcut Overlay, без необходимости запуска приложения в фоновом режиме для ожидания ввода данных. – Sean Davis 17 May 2012 в 23:05
  • 2
    Ах, боюсь, я все еще не полностью понимаю логистику ваших требований, но это, вероятно, просто означает, что я не в моих силах. Извините за шум, и я надеюсь, что вы получите полезный ответ. – TLE 18 May 2012 в 00:40
  • 3
    Я думаю, что я понимаю, что проблема лучше с новым описанием. Этот ярлык, который вы упомянули, должен запустить программу, является ли ярлык в программе, которую вы управляете / записываете, или системной глобальной, такой как ctrl-alt-t, чтобы открыть терминал и т. Д.? – TLE 19 May 2012 в 15:52
  • 4
    Просто обратите внимание на мои требования к логистике для такой же проблемы: я разрабатываю плагин для приложения pygtk; приложение само регистрируется как слушатель для заданного ярлыка. Я хотел бы, чтобы плагин выполнял разные вещи, основываясь на том, сохраняются ли ключи для этого ярлыка или нет, однако мне кажется, что мне придется изменить ядро ​​приложения, чтобы иметь управление на основе пресса / релиз. Если бы у меня был способ «заглянуть», в состояние клавиш клавиатуры в любое время - тогда плагин мог бы использовать это вместо изменения ядра приложения. – sdaau 8 April 2013 в 19:55

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

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