개발중인 Gtk 앱에서 바로 가기 키를 어떻게 만들고 사용합니까?


9

Python + Gtk에서 Ubuntu App Showdown을위한 응용 프로그램을 빠르게 만들고 있습니다. Discvur라고합니다. 키보드 단축키를 포함하고 싶었습니다.

웹을 검색하면서 AccelGroup에 대한이 페이지gtk_widget_add_accelerator 에 대한이 페이지를 찾았 지만 시작하는 방법을 이해하지 못합니다. 적절한 신호를 정의한 다음 어플리케이션에서 사용하는 방법을 알려주시겠습니까?


첫 번째 링크가 끊어졌습니다 ...
WinEunuuchs2Unix

답변:


8

다음은 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)

고맙지 만이 오류가 발생했습니다 : self.add_accelerator(self.quick_add_entry, "<Control>l", signal="grab-focus") AttributeError: 'DiscvurWindow' object has no attribute 'quick_add_entry'. "quick_add_entry"의 웹 검색을 시도하면 어디서나 찾을 수 없습니다. 그것이 올바른 기능이라고 확신합니까? 이에 대한 자세한 정보 / 자습서는 어디서 찾을 수 있습니까? 또한 "<Control> l"은 Ctrl + l을 의미합니까, 아니면 잘못된 유형입니까?
Agmenor

함수가 아닙니다. 액셀러레이터를 연결하는 위젯의 이름 일뿐입니다. 더 명확하게 수정했습니다.
브라이스

답변 주셔서 감사합니다. 먼저, "gtk"를 "Gtk"로 바꾸는 자유를 가졌습니다. 둘째, 코드를 실행할 때 "NameError : global name 'DEBUG'is not defined"가 표시되므로 이것이 자신의 스크립트에있는 변수라고 가정합니다. 그래서 나는 내 자신의 스크립트로 주석을 달았습니다. 셋째, 주석 처리 한 후 "AttributeError : 'DiscvurWindow'개체에 'accelerators'특성이 없습니다"라는 오류가 발생합니다. 이것이 분명한 것으로 유감이지만 문서가 여전히 모호합니다. 특히 설명서에는 add_accelerator에 6 개의 인수가 필요하다고 나와 있습니까?
Agmenor

맞습니다. 액셀러레이터를 직접 만들어야합니다. 방법을 보여주기 위해 예제를 업데이트했습니다.
브라이스

약간의 연구와 실패한 시도 후에, 나는 일하는 대본을 얻을 수있었습니다. 확인해 주시겠습니까? 정확하다고 생각되면 paste.ubuntu.com/1053516으로 답을 수정하십시오 . 검토해 주셔서 감사합니다, 브라이스. "작은 연구"는 완곡 어 였지만 나는 물고기에게 물고기를주는 것보다 낚시하는 법을 배우는 것이 낫다고 생각합니다. 다시 한 번 감사드립니다.
Agmenor

6

마지막으로 작동 한 코드는 다음과 같습니다. 내 개발 환경 인 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에서는 "discvur_window"라는 창에 "entry1"이라는 GtkEntry를 만들었습니다. '신호'탭에서 "backspace"신호에 "on_erasing"이라는 핸들러를 제공했습니다.

이제 Backspace또는 Ctrl+ B를 누르면 터미널이 "작동합니다."


Ctrl + F4 단축키를 비활성화하여 창을 닫는 데 사용할 수 있습니까?
Juzer Ali

Alt + F4를 의미합니까? 모르겠어요, 시도하지 않았습니다.
Agmenor

나는 Ctrl + F4와 Alt + F4를 모두 의미했다
Juzer Ali

2

이 스레드의 주어진 답변을 독립 실행 형 예제로 다시 패키지했습니다.

#!/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신호를.


그래서 나는 알아 차렸다. clicked액셀러레이터를 사용할 때 매우 빠르게 으깬 수 있지만 버튼이 시각적으로 눌리지는 않습니다. 를 사용 activate하면 버튼이 눌려 지지만, 시각적 눌림이 완료된 후에 만 ​​가속기를 누를 수 있습니다.
ThorSummoner 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.