Как создать и использовать сочетания клавиш в приложении Gtk, которое я разрабатываю?

Это интересная концепция и хороший способ работать со стыковкой с краем, где два монитора встречаются

8
задан 24 June 2012 в 02:32

26 ответов

Вот код, который наконец-то сработал. Поскольку это сильно зависит от моей среды разработки Quickly + Glade + Python + Gtk, я делаю это независимым ответом. Ответ Брайса очень помог, и мои обмены с aking1012 .

Фактический код в текстовом редакторе:

# Accelerators
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
        print "The accelerator is well added with the signal " + signal

def on_erasing(self, widget):
    print "It works."

В Glade я создал GtkEntry под названием «entry1» в моем окне под названием «discvur_window». На вкладке «Сигналы» я дал сигнал «backspace» обработчика под названием «on_erasing».

Теперь, нажав Backspace или Ctrl + B, терминал распечатает «It works».

6
ответ дан 25 July 2018 в 18:24

Вот код, который наконец-то сработал. Поскольку это сильно зависит от моей среды разработки Quickly + Glade + Python + Gtk, я делаю это независимым ответом. Ответ Брайса очень помог, и мои обмены с aking1012 .

Фактический код в текстовом редакторе:

# Accelerators
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
        print "The accelerator is well added with the signal " + signal

def on_erasing(self, widget):
    print "It works."

В Glade я создал GtkEntry под названием «entry1» в моем окне под названием «discvur_window». На вкладке «Сигналы» я дал сигнал «backspace» обработчика под названием «on_erasing».

Теперь, нажав Backspace или Ctrl + B, терминал распечатает «It works».

6
ответ дан 31 July 2018 в 11:05

Вот код, который наконец-то сработал. Поскольку это сильно зависит от моей среды разработки Quickly + Glade + Python + Gtk, я делаю это независимым ответом. Ответ Брайса очень помог, и мои обмены с aking1012 .

Фактический код в текстовом редакторе:

# Accelerators
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
        print "The accelerator is well added with the signal " + signal

def on_erasing(self, widget):
    print "It works."

В Glade я создал GtkEntry под названием «entry1» в моем окне под названием «discvur_window». На вкладке «Сигналы» я дал сигнал «backspace» обработчика под названием «on_erasing».

Теперь, нажав Backspace или Ctrl + B, терминал распечатает «It works».

6
ответ дан 31 July 2018 в 12:03

Вот код, который наконец-то сработал. Поскольку это сильно зависит от моей среды разработки Quickly + Glade + Python + Gtk, я делаю это независимым ответом. Ответ Брайса очень помог, и мои обмены с aking1012 .

Фактический код в текстовом редакторе:

# Accelerators
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
        print "The accelerator is well added with the signal " + signal

def on_erasing(self, widget):
    print "It works."

В Glade я создал GtkEntry под названием «entry1» в моем окне под названием «discvur_window». На вкладке «Сигналы» я дал сигнал «backspace» обработчика под названием «on_erasing».

Теперь, нажав Backspace или Ctrl + B, терминал распечатает «It works».

6
ответ дан 2 August 2018 в 00:36

Вот код, который наконец-то сработал. Поскольку это сильно зависит от моей среды разработки Quickly + Glade + Python + Gtk, я делаю это независимым ответом. Ответ Брайса очень помог, и мои обмены с aking1012 .

Фактический код в текстовом редакторе:

# Accelerators
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
        print "The accelerator is well added with the signal " + signal

def on_erasing(self, widget):
    print "It works."

В Glade я создал GtkEntry под названием «entry1» в моем окне под названием «discvur_window». На вкладке «Сигналы» я дал сигнал «backspace» обработчика под названием «on_erasing».

Теперь, нажав Backspace или Ctrl + B, терминал распечатает «It works».

6
ответ дан 4 August 2018 в 16:06

Вот код, который наконец-то сработал. Поскольку это сильно зависит от моей среды разработки Quickly + Glade + Python + Gtk, я делаю это независимым ответом. Ответ Брайса очень помог, и мои обмены с aking1012 .

Фактический код в текстовом редакторе:

# Accelerators
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
        print "The accelerator is well added with the signal " + signal

def on_erasing(self, widget):
    print "It works."

В Glade я создал GtkEntry под названием «entry1» в моем окне под названием «discvur_window». На вкладке «Сигналы» я дал сигнал «backspace» обработчика под названием «on_erasing».

Теперь, нажав Backspace или Ctrl + B, терминал распечатает «It works».

6
ответ дан 6 August 2018 в 00:44

Вот код, который наконец-то сработал. Поскольку это сильно зависит от моей среды разработки Quickly + Glade + Python + Gtk, я делаю это независимым ответом. Ответ Брайса очень помог, и мои обмены с aking1012 .

Фактический код в текстовом редакторе:

# Accelerators
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
        print "The accelerator is well added with the signal " + signal

def on_erasing(self, widget):
    print "It works."

В Glade я создал GtkEntry под названием «entry1» в моем окне под названием «discvur_window». На вкладке «Сигналы» я дал сигнал «backspace» обработчика под названием «on_erasing».

Теперь, нажав Backspace или Ctrl + B, терминал распечатает «It works».

6
ответ дан 10 August 2018 в 06:55

Вот код, который наконец-то сработал. Поскольку это сильно зависит от моей среды разработки Quickly + Glade + Python + Gtk, я делаю это независимым ответом. Ответ Брайса очень помог, и мои обмены с aking1012 .

Фактический код в текстовом редакторе:

# Accelerators
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
        print "The accelerator is well added with the signal " + signal

def on_erasing(self, widget):
    print "It works."

В Glade я создал GtkEntry под названием «entry1» в моем окне под названием «discvur_window». На вкладке «Сигналы» я дал сигнал «backspace» обработчика под названием «on_erasing».

Теперь, нажав Backspace или Ctrl + B, терминал распечатает «It works».

6
ответ дан 15 August 2018 в 18:53
  • 1
    Может ли это использоваться для отключения сочетания клавиш Ctrl + F4, чтобы закрыть окно? – Juzer Ali 3 September 2012 в 22:04
  • 2
    Вы имеете в виду Alt + F4? Я не знаю, я не пробовал. – Agmenor 4 September 2012 в 01:35
  • 3
    Я имел в виду как Ctrl + F4, так и Alt + F4 – Juzer Ali 4 September 2012 в 18:24

Вот несколько бит кода из одного из моих приложений Python + Gtk, далее расширенный в соответствии с комментариями к этому ответу:

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
8
ответ дан 25 May 2018 в 09:55
  • 1
    Спасибо, но я получил эту ошибку: self.add_accelerator(self.quick_add_entry, "<Control>l", signal="grab-focus") AttributeError: 'DiscvurWindow' object has no attribute 'quick_add_entry'. Когда я пытаюсь выполнить поиск в Интернете «quick_add_entry», я не могу найти его нигде. Вы уверены, что это правильная функция? Где я могу найти дополнительную информацию / учебник для этого? Кроме того, имеетс " & lt; Control & lt; l " означает Ctrl + l или это ошибка? – Agmenor 20 June 2012 в 23:01
  • 2
    Это не функция, это просто имя любого виджета, к которому вы подключаете ускоритель. Я пересмотрел его, чтобы яснее. – Bryce 21 June 2012 в 00:06
  • 3
    Спасибо за ваш ответ. Во-первых, я взял на себя смелость изменить «gtk». в "Gtk". Во-вторых, когда я запускаю свой код, я получаю " NameError: глобальное имя «DEBUG» не определено & quot ;, поэтому я полагаю, что это переменная из вашего собственного скрипта. Поэтому я прокомментировал это в своем собственном сценарии. В-третьих, после того, как я прокомментировал это, я получаю сообщение об ошибке «Объект AttributeError:« DiscvurWindow »не имеет атрибутов« ускорители ». Мне жаль, если это должно быть очевидно, но документация по-прежнему неясна для меня; в частности, в документации говорится, что add_accelerator требует 6 аргументов? – Agmenor 21 June 2012 в 08:18
  • 4
    Правильно, вам нужно создавать ускорители самостоятельно; Я обновил пример, чтобы показать, как это сделать. – Bryce 21 June 2012 в 11:21
  • 5
    После небольшого исследования и неудачных попыток я мог получить рабочий сценарий. Не могли бы вы подтвердить это? Если вы считаете, что это правильно, я (или вы можете) изменить свой ответ: paste.ubuntu.com/1053516 . Я был бы очень признателен за ваш отзыв, Брайс. "Небольшое исследование " был эвфемизмом, но я полагаю, что лучше узнать человека, как ловить рыбу, чем давать ему рыбу. Так что еще раз спасибо. – Agmenor 22 June 2012 в 05:36

Я переупаковал приведенные ответы в этом потоке в отдельный пример:

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Thinking... (This could take forever)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accelerators
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()
Также доступен как gist: https://gist.github.com/thorsummoner/230bed5bbd3380bd5949 [!d1 ]

Примечание: сигнал по умолчанию clicked, а не activate, потому что приложения никогда не должны подключаться к сигналу ::activate, но использовать сигнал Gtk.Button ::clicked.

1
ответ дан 25 May 2018 в 09:55
  • 1
    Поэтому я заметил; при использовании clicked ускоритель может быть выгнут очень быстро, но кнопка не визуально нажата. При использовании activate кнопка будет нажата, но ускоритель может быть нажат только после завершения визуального нажатия. – ThorSummoner 19 January 2016 в 01:44

Вот несколько бит кода из одного из моих приложений Python + Gtk, далее расширенный в соответствии с комментариями к этому ответу:

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
8
ответ дан 25 July 2018 в 18:24

Я переупаковал данные ответы в этом потоке в отдельный пример:

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Thinking... (This could take forever)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accelerators
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()

Также доступен как сущность: https://gist.github.com/ thorsummoner / 230bed5bbd3380bd5949

Примечание: сигнал по умолчанию clicked, а не activate, поскольку приложения никогда не должны подключаться к сигналу ::activate, но использовать Gtk.Button ::clicked.

1
ответ дан 25 July 2018 в 18:24

Вот несколько бит кода из одного из моих приложений Python + Gtk, далее расширенный в соответствии с комментариями к этому ответу:

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
8
ответ дан 31 July 2018 в 11:05

Я переупаковал данные ответы в этом потоке в отдельный пример:

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Thinking... (This could take forever)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accelerators
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()

Также доступен как сущность: https://gist.github.com/ thorsummoner / 230bed5bbd3380bd5949

Примечание: сигнал по умолчанию clicked, а не activate, поскольку приложения никогда не должны подключаться к сигналу ::activate, но использовать Gtk.Button ::clicked.

1
ответ дан 31 July 2018 в 11:05

Я переупаковал данные ответы в этом потоке в отдельный пример:

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Thinking... (This could take forever)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accelerators
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()

Также доступен как сущность: https://gist.github.com/ thorsummoner / 230bed5bbd3380bd5949

Примечание: сигнал по умолчанию clicked, а не activate, поскольку приложения никогда не должны подключаться к сигналу ::activate, но использовать Gtk.Button ::clicked.

1
ответ дан 31 July 2018 в 12:03

Вот несколько бит кода из одного из моих приложений Python + Gtk, далее расширенный в соответствии с комментариями к этому ответу:

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
8
ответ дан 31 July 2018 в 12:03

Вот несколько бит кода из одного из моих приложений Python + Gtk, далее расширенный в соответствии с комментариями к этому ответу:

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
8
ответ дан 2 August 2018 в 00:36

Я переупаковал данные ответы в этом потоке в отдельный пример:

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Thinking... (This could take forever)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accelerators
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()

Также доступен как сущность: https://gist.github.com/ thorsummoner / 230bed5bbd3380bd5949

Примечание: сигнал по умолчанию clicked, а не activate, поскольку приложения никогда не должны подключаться к сигналу ::activate, но использовать Gtk.Button ::clicked.

1
ответ дан 4 August 2018 в 16:06

Вот несколько бит кода из одного из моих приложений Python + Gtk, далее расширенный в соответствии с комментариями к этому ответу:

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
8
ответ дан 4 August 2018 в 16:06

Я переупаковал данные ответы в этом потоке в отдельный пример:

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Thinking... (This could take forever)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accelerators
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()

Также доступен как сущность: https://gist.github.com/ thorsummoner / 230bed5bbd3380bd5949

Примечание: сигнал по умолчанию clicked, а не activate, поскольку приложения никогда не должны подключаться к сигналу ::activate, но использовать Gtk.Button ::clicked.

1
ответ дан 6 August 2018 в 00:44

Я переупаковал данные ответы в этом потоке в отдельный пример:

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Thinking... (This could take forever)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accelerators
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()

Также доступен как сущность: https://gist.github.com/ thorsummoner / 230bed5bbd3380bd5949

Примечание: сигнал по умолчанию clicked, а не activate, поскольку приложения никогда не должны подключаться к сигналу ::activate, но использовать Gtk.Button ::clicked.

1
ответ дан 7 August 2018 в 18:09

Вот несколько бит кода из одного из моих приложений Python + Gtk, далее расширенный в соответствии с комментариями к этому ответу:

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
8
ответ дан 7 August 2018 в 18:09

Я переупаковал данные ответы в этом потоке в отдельный пример:

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Thinking... (This could take forever)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accelerators
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()

Также доступен как сущность: https://gist.github.com/ thorsummoner / 230bed5bbd3380bd5949

Примечание: сигнал по умолчанию clicked, а не activate, поскольку приложения никогда не должны подключаться к сигналу ::activate, но использовать Gtk.Button ::clicked.

1
ответ дан 10 August 2018 в 06:55

Вот несколько бит кода из одного из моих приложений Python + Gtk, далее расширенный в соответствии с комментариями к этому ответу:

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
8
ответ дан 10 August 2018 в 06:55

Я переупаковал данные ответы в этом потоке в отдельный пример:

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Thinking... (This could take forever)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accelerators
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()

Также доступен как сущность: https://gist.github.com/ thorsummoner / 230bed5bbd3380bd5949

Примечание: сигнал по умолчанию clicked, а не activate, поскольку приложения никогда не должны подключаться к сигналу ::activate, но использовать Gtk.Button ::clicked.

1
ответ дан 15 August 2018 в 18:53
  • 1
    Поэтому я заметил; при использовании clicked ускоритель может быть выгнут очень быстро, но кнопка не визуально нажата. При использовании activate кнопка будет нажата, но ускоритель может быть нажат только после завершения визуального нажатия. – ThorSummoner 19 January 2016 в 01:44

Вот несколько бит кода из одного из моих приложений Python + Gtk, далее расширенный в соответствии с комментариями к этому ответу:

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
8
ответ дан 15 August 2018 в 18:53
  • 1
    Спасибо, но я получил эту ошибку: self.add_accelerator(self.quick_add_entry, "<Control>l", signal="grab-focus") AttributeError: 'DiscvurWindow' object has no attribute 'quick_add_entry'. Когда я пытаюсь выполнить поиск в Интернете «quick_add_entry», я не могу найти его нигде. Вы уверены, что это правильная функция? Где я могу найти дополнительную информацию / учебник для этого? Кроме того, имеетс & quot; & lt; Control & lt; l & quot; означает Ctrl + l или это ошибка? – Agmenor 20 June 2012 в 23:01
  • 2
    Это не функция, это просто имя любого виджета, к которому вы подключаете ускоритель. Я пересмотрел его, чтобы яснее. – Bryce 21 June 2012 в 00:06
  • 3
    Спасибо за ваш ответ. Во-первых, я взял на себя смелость изменить «gtk». в "Gtk". Во-вторых, когда я запускаю свой код, я получаю & quot; NameError: глобальное имя «DEBUG» не определено & quot ;, поэтому я полагаю, что это переменная из вашего собственного скрипта. Поэтому я прокомментировал это в своем собственном сценарии. В-третьих, после того, как я прокомментировал это, я получаю сообщение об ошибке «Объект AttributeError:« DiscvurWindow »не имеет атрибутов« ускорители ». Мне жаль, если это должно быть очевидно, но документация по-прежнему неясна для меня; в частности, в документации говорится, что add_accelerator требует 6 аргументов? – Agmenor 21 June 2012 в 08:18
  • 4
  • 5
    После небольшого исследования и неудачных попыток я мог получить рабочий сценарий. Не могли бы вы подтвердить это? Если вы считаете, что это правильно, я (или вы можете) изменить свой ответ: paste.ubuntu.com/1053516 . Я был бы очень признателен за ваш отзыв, Брайс. "Небольшое исследование & quot; был эвфемизмом, но я полагаю, что лучше узнать человека, как ловить рыбу, чем давать ему рыбу. Так что еще раз спасибо. – Agmenor 22 June 2012 в 05:36

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

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