Python + Gtk에서 Ubuntu App Showdown을위한 응용 프로그램을 빠르게 만들고 있습니다. Discvur라고합니다. 키보드 단축키를 포함하고 싶었습니다.
웹을 검색하면서 AccelGroup에 대한이 페이지 와 gtk_widget_add_accelerator 에 대한이 페이지를 찾았 지만 시작하는 방법을 이해하지 못합니다. 적절한 신호를 정의한 다음 어플리케이션에서 사용하는 방법을 알려주시겠습니까?
Python + Gtk에서 Ubuntu App Showdown을위한 응용 프로그램을 빠르게 만들고 있습니다. Discvur라고합니다. 키보드 단축키를 포함하고 싶었습니다.
웹을 검색하면서 AccelGroup에 대한이 페이지 와 gtk_widget_add_accelerator 에 대한이 페이지를 찾았 지만 시작하는 방법을 이해하지 못합니다. 적절한 신호를 정의한 다음 어플리케이션에서 사용하는 방법을 알려주시겠습니까?
답변:
다음은 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을 의미합니까, 아니면 잘못된 유형입니까?
마지막으로 작동 한 코드는 다음과 같습니다. 내 개발 환경 인 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를 누르면 터미널이 "작동합니다."
이 스레드의 주어진 답변을 독립 실행 형 예제로 다시 패키지했습니다.
#!/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하면 버튼이 눌려 지지만, 시각적 눌림이 완료된 후에 만 가속기를 누를 수 있습니다.