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

4

Eu queria saber se alguém sabia como detectar se uma chave é atualmente pressionada com Gtk ou Gdk e python? Não quero usar o evento de pressionamento de tecla ou de liberação de chave para esse cenário, mas, em vez disso, verifique se ele está atualmente pressionado na inicialização do aplicativo.

Especificamente, aqui está o que eu gostaria que meu aplicativo fizesse:

  1. Comece a abrir pelo atalho de teclado.
  2. Espere 2 segundos.
  3. Se o atalho do teclado ainda for mantido após 2 segundos, mostre a janela.
  4. Se, a qualquer momento durante o temporizador de 2 segundos, o atalho de teclado for liberado, não mostre a janela e saia.

Isso é semelhante à funcionalidade vista na sobreposição de atalhos de teclado Unity, em que você mantém pressionada a tecla SUPER por 2 segundos e a janela é exibida. Se houver uma maneira melhor de fazer isso (preferencialmente sem o programa rodando em segundo plano e esperando), isso também seria aceitável.

Esperando pelo melhor,

Sean

    
por Sean Davis 05.05.2012 / 14:14

2 respostas

2

Supondo que você esteja falando sobre um botão comum (como se fosse um botão de alternância), você pode ver todos os métodos que tem aqui . Ao lê-lo, parece que não há uma função para o que você está procurando, provavelmente porque essas coisas são projetadas para serem acionadas por eventos.

Em qualquer caso, eu estou querendo saber, você não pode apenas pegar os eventos para definir um booleano e dar uma olhada nisso para ver se ele está pressionado. Caso contrário, talvez você possa explicar a razão pela qual é importante para você contornar os eventos.

EDITAR

Depois de perceber que eu te interpretei mal o post original e que você estava falando sobre as teclas do teclado e não sobre os botões, eu sugeri a seguinte sugestão.

Quando o programa é executado, ele fará uma janela gtk e a ocultará, para possibilitar a escuta de eventos do teclado. Em seguida, ele escutará os eventos liberados da chave de qualquer uma das teclas que estão no atalho que iniciou o programa (nesse caso, ctrl-alt-u). Se qualquer uma dessas chaves for liberada, dentro do tempo limite de inicialização, ela será encerrada no final do tempo limite, caso contrário, mostrará o programa.

Se você quiser atrasar o início real do código do programa para economizar recursos, é claro que você pode usar uma janela fictícia e não carregar a janela real ou qualquer uma das classes subjacentes antes na função 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()
    
por TLE 17.05.2012 / 11:55
0

Vou apenas adicionar uma nota aqui; Eu acabei de aprender sobre a biblioteca keybinder , que aparentemente é separada das notas do Tomboy (embora seja Gtk2, e eu acabei de ver o rótulo Gtk3):

É compilado a partir de C como uma biblioteca de objetos compartilhados .so e possui uma interface Python:

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

Veja a fonte em keybinder / libkeybinder no master · engla / keybinder · GitHub ; Eu posso ver que, mesmo em um nível C, a implementação é através da inscrição para eventos keypress - e não há nada (aparente para mim) mantendo o estado real pressionado das teclas do teclado. O que provavelmente significa que, infelizmente, não há um recurso (função, array) para procurar um estado pressionado de uma tecla (ny) a qualquer momento.

    
por sdaau 08.04.2013 / 17:16