Как преобразовать нажатую клавишу в другую в pygtk - PullRequest
4 голосов
/ 02 июля 2010

Я пытаюсь заставить мое приложение pygtk вести себя так же, как openoffice calc, относительно десятичной точки. Это означает, что при получении клавиши KP_Decimal (точка на клавиатуре) я хочу, чтобы мои записи отображали любую десятичную точку в текущей локали (точку или запятую соответственно).

Я долго искал и не смог найти, как это сделать. Я могу захватить key_press_event в Gtk.Entry и проверить KP_Decimal, и я могу получить текущую настройку локали для десятичной точки; но я не знаю, как преобразовать точку в запятую, если это необходимо.

Я хочу, чтобы это изменение было глобальным для приложения, а не специфичным для определенных записей, поэтому было бы лучше, если бы это можно было сделать с помощью чего-то более общего, например, методов ввода. Я также читал о них, и я не мог найти способ использовать их так, как я хочу.

1 Ответ

2 голосов
/ 29 августа 2010

Один из способов сделать это - создать подкласс gtk.Entry, например, так:

import gtk
import locale

class NumericEntry(gtk.Entry):
    __gsignals__ = {
        'key_press_event': 'override'
    }
    def do_key_press_event(self, event):
        if event.keyval == gtk.gdk.keyval_from_name('KP_Decimal'):
            event.keyval = int(gtk.gdk.unicode_to_keyval(ord(locale.localeconv()['decimal_point'])))
        gtk.Entry.do_key_press_event(self, event)

Я не полностью проверил это, поэтому возможны один или два крайних случая, но, похоже,отлично работает для меня.

Хорошая особенность использования подкласса состоит в том, что тогда легко заменить существующие виджеты - просто используйте NumericEntry вместо gtk.Entry всякий раз, когда вам нужна текстовая запись с таким поведением.

Надеюсь, это поможет!

...