Как вернуть правильное использование письма с модификатором - PullRequest
0 голосов
/ 29 января 2020

Комбинация клавиш a + mod1 должна вернуть букву с хвостом ą на моем родном языке Poli sh, в то время как gtk возвращает aogonek.

Как исправить эту проблему для этой и других клавиш?

(...)

   def on_key_release(self, widget, event, data=None):
        keyval = event.keyval
        keyname = Gdk.keyval_name(keyval)
        ctrl = (event.state & Gdk.ModifierType.CONTROL_MASK)
        shift = (event.state & Gdk.ModifierType.SHIFT_MASK)
        mod1 = (event.state & Gdk.ModifierType.MOD1_MASK)
        super = (event.state & Gdk.ModifierType.SUPER_MASK)
        hyper = (event.state & Gdk.ModifierType.HYPER_MASK)
        meta = (event.state & Gdk.ModifierType.META_MASK)
        lock = (event.state & Gdk.ModifierType.LOCK_MASK)

        if keyname in self.buffer:
            self.buffer.remove(keyname)
            if self.buffer:
                self.textbuffer.insert_at_cursor('you released '+'+'.join(self.buffer)+'\n')

    def on_key_down(self, widget, event, data=None):
        keyval = event.keyval
        keyname = Gdk.keyval_name(keyval)
        ctrl = (event.state & Gdk.ModifierType.CONTROL_MASK)
        shift = (event.state & Gdk.ModifierType.SHIFT_MASK)
        mod1 = (event.state & Gdk.ModifierType.MOD1_MASK)
        super = (event.state & Gdk.ModifierType.SUPER_MASK)
        hyper = (event.state & Gdk.ModifierType.HYPER_MASK)
        meta = (event.state & Gdk.ModifierType.META_MASK)
        lock = (event.state & Gdk.ModifierType.LOCK_MASK)

        if keyname in 'AĄz aogonek żółćgęśaą' and keyname and (shift or mod1 or ctrl or super or hyper or meta or lock) not in self.buffer:
            self.buffer.append(keyname)
            if self.buffer:
                self.textbuffer.insert_at_cursor('you pressed '+'+'.join(self.buffer)+'\n')

(...)

Ответы [ 2 ]

0 голосов
/ 30 января 2020

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

   def on_key_down(self, widget, event, data=None):
        keyval = event.keyval
        keyname = Gdk.keyval_name(keyval)
        self.textbuffer.insert_at_cursor(keyname+'\n')

в этой функции, когда вы пытаетесь напечатать специальные символы, такие как @, они будут напечатаны "at", так как это имя_раздел. чтобы напечатать текст, полученный в результате нажатия этой клавиши, вы должны изменить его на

self.textbuffer.insert_at_cursor(event.string+'\n')

https://developer.gnome.org/gdk3/stable/gdk3-Event-Structures.html#GdkEventKey

или в качестве альтернативы вы можете распространить событие ключа на текстовое представление

https://developer.gnome.org/gtk3/stable/GtkWindow.html#gtk окно-событие распространения ключа https://developer.gnome.org/gtk3/stable/chap-input-handling.html

0 голосов
/ 30 января 2020
``import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

class MyWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="awesome gui")
        self.set_resizable(True)
        self.set_default_size(700, 550)
        self.grid = Gtk.Grid()
        self.add(self.grid)
        self.create_textview()
        self.create_buttons()
        self.buffer = []

    def create_textview(self):
        scrolledwindow = Gtk.ScrolledWindow()
        scrolledwindow.set_hexpand(True)
        scrolledwindow.set_vexpand(True)
        self.grid.attach(scrolledwindow, 0, 2, 80, 1)
        self.textview = Gtk.TextView()
        scrolledwindow.add(self.textview)

        self.textbuffer = self.textview.get_buffer()
        self.textview.set_editable(False)
        self.textview.set_cursor_visible(False)

    def create_buttons(self):
        self.button1 = Gtk.Button(label="Clear text")
        self.button1.connect("clicked", self.on_button1_clicked)
        self.grid.attach(self.button1, 0,  0, 1, 1)
        self.button2 = Gtk.Button(label="Start capturing")
        self.button2.connect("key-release-event", self.on_key_release)
        self.button2.connect("key-press-event", self.on_key_down)
        self.grid.attach_next_to(self.button2, self.button1, Gtk.PositionType.RIGHT, 1, 1)

    def on_button1_clicked(self, widget):
        self.textbuffer.set_text('')

    def on_key_release(self, widget, event, data=None):
        keyval = event.keyval
        keyname = Gdk.keyval_name(keyval)

        if keyname in self.buffer:
            self.buffer.remove(keyname)
            if self.buffer:
                self.textbuffer.insert_at_cursor('you released '+'+'.join(self.buffer)+'\n')

    def on_key_down(self, widget, event, data=None):
        keyval = event.keyval
        keyname = Gdk.keyval_name(keyval)
        ctrl = (event.state & Gdk.ModifierType.CONTROL_MASK)
        shift = (event.state & Gdk.ModifierType.SHIFT_MASK)
        mod1 = (event.state & Gdk.ModifierType.MOD1_MASK)
        super = (event.state & Gdk.ModifierType.SUPER_MASK)
        hyper = (event.state & Gdk.ModifierType.HYPER_MASK)
        meta = (event.state & Gdk.ModifierType.META_MASK)
        lock = (event.state & Gdk.ModifierType.LOCK_MASK)

        if keyname in 'AĄzżółćgęśaą' and keyname and (shift or mod1 or ctrl or super or hyper or meta or lock) not in self.buffer:
            self.buffer.append(keyname)
            if self.buffer:
                self.textbuffer.insert_at_cursor('you pressed '+'+'.join(self.buffer)+'\n')


win = MyWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()``
...