Criando um evento de imprensa de tecla GTK + 2

2

Eu escrevi um pequeno programa GTK + 2+ (em Python) que responde a um clique de botão, enviando um gtk.Event para simular uma tecla pressionada. Ele funciona bem em todas as versões do Ubuntu que eu tenho incluindo o Kubuntu, mas ele falha em todas as versões do Lubuntu.

No Lubuntu, o caractere que é transmitido pelo Evento é determinado por event.hardware_keycode ; event.keyval não importa. Em todas as outras plataformas, o caractere é determinado por event.keyval e event.hardware_keycode não importa.

O problema é que, até onde posso dizer, não é possível especificar caracteres Unicode através de event.hardware_keycode , porque eles não possuem uma chave correspondente. O Unicode funciona bem em outras plataformas usando keyval.

Alguém sabe como fazer com que o Lubuntu se comporte como o Ubuntu a esse respeito? Se não, alguém pode sugerir um lugar melhor para postar essa pergunta?

Aqui está um programa de teste simples, como solicitado por Sneetsher:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gtk

class KeyPressTest:
    def __init__(self):
        button = gtk.Button("Test")
        button.connect('clicked', self.on_button_clicked)
        button.set_can_focus(False)
        entry = gtk.Entry()
        vbox = gtk.VBox()
        vbox.pack_start(button)
        vbox.pack_start(entry, expand=False)
        window = gtk.Window()
        window.connect('destroy', lambda w: gtk.main_quit())
        window.add(vbox)
        window.show_all()

    def on_button_clicked(self, button):
        # Lubuntu ignores keyval, so you get "a" in the entry when you click
        # the button.  Ubuntu ignores hardware_keycode, so you get À.  I could
        # make the program work on all platforms by specifying both, but what
        # is hardware_keycode for unicode characters?
        event = gtk.gdk.Event(gtk.gdk.KEY_PRESS)
        event.keyval = int(gtk.gdk.unicode_to_keyval(ord(unicode(u"À"))))
        event.hardware_keycode = 38  # hardware keycode for "a"
        event.window = button.get_window()
        event.put()

if __name__ == "__main__":
    u = KeyPressTest()
    gtk.main()

Aqui está a resposta: Lubuntu tem um conjunto de variáveis de ambiente para especificar o método de entrada:

GTK_IM_MODULE = xim

Desmarque essa variável e o programa acima funciona.

    
por beezergeezer 04.01.2015 / 23:29

1 resposta

0

Não há hardware_keycode para um caractere unicode a menos que você possa digitá-lo pressionando uma tecla. Veja xmodmap sobre como mapear um caractere unicode para uma tecla física do teclado. Aproveite.

    
por Henry 09.02.2015 / 11:41