Làm cách nào để tạo và sử dụng phím tắt trong ứng dụng Gtk mà tôi đang phát triển?


9

Tôi đang tạo một ứng dụng cho Ubuntu App Showdown trong Python + Gtk một cách nhanh chóng. Tôi gọi nó là Discvur. Tôi muốn có một số phím tắt.

Tìm kiếm trên web, tôi tìm thấy trang này về Accelgrouptrang này về gtk_widget_add_accelerator nhưng tôi không hiểu làm thế nào để bắt đầu với nó. Bạn có thể cho tôi biết làm thế nào tôi sẽ xác định một tín hiệu thích hợp và sau đó sử dụng nó trong ứng dụng của tôi?


Liên kết đầu tiên bị hỏng ...
WinEunuuchs2Unix

Câu trả lời:


8

Đây là một số đoạn mã từ một trong các ứng dụng Python + Gtk của tôi, được mở rộng thêm theo các nhận xét cho câu trả lời này:

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)

Cảm ơn bạn nhưng tôi đã nhận được lỗi này : self.add_accelerator(self.quick_add_entry, "<Control>l", signal="grab-focus") AttributeError: 'DiscvurWindow' object has no attribute 'quick_add_entry'. Khi tôi thử tìm kiếm trên web "quick_add_entry", tôi không thể tìm thấy nó ở bất cứ đâu. Bạn có chắc chắn đó là chức năng đúng? Tôi có thể tìm thêm thông tin / hướng dẫn cho việc này ở đâu? Ngoài ra, "<Control> l" có nghĩa là Ctrl + l hay nó là một loại nhầm?
Agmenor

Đây không phải là một chức năng, đó chỉ là tên của bất kỳ tiện ích nào bạn đang kết nối máy gia tốc. Tôi đã sửa đổi nó để rõ ràng hơn.
Bryce

Cảm ơn bạn vì câu trả lời. Đầu tiên, tôi lấy tự do để thay đổi "gtk" thành "Gtk". Thứ hai, khi tôi chạy mã của bạn, tôi nhận được "NameError: tên toàn cầu 'DEBUG' không được xác định", vì vậy tôi cho rằng đây là một biến từ tập lệnh của riêng bạn. Vì vậy, tôi nhận xét nó trong kịch bản của riêng tôi. Thứ ba, sau khi nhận xét nó, tôi nhận được lỗi "AttributionError: 'DiscvurWindow' đối tượng không có thuộc tính 'máy gia tốc'". Tôi xin lỗi nếu điều này được coi là hiển nhiên nhưng tài liệu vẫn còn mù mờ đối với tôi; cụ thể là tài liệu nói add_accelerator cần 6 đối số?
Agmenor

Phải, bạn cần phải tự tạo ra máy gia tốc; Tôi đã cập nhật ví dụ để cho thấy làm thế nào.
Bryce

Sau một chút nghiên cứu và thử thất bại, tôi có thể có được một kịch bản hoạt động. Bạn có thể vui lòng xác minh nó? Nếu bạn nghĩ đó là chính xác, tôi sẽ (hoặc bạn có thể) sửa đổi câu trả lời của bạn: paste.ubfox.com/1053516 . Tôi sẽ đánh giá cao đánh giá của bạn rất nhiều, Bryce. "Một nghiên cứu nhỏ" là một uyển ngữ, nhưng tôi cho rằng tốt hơn là học một người đàn ông làm thế nào để câu cá hơn là cho anh ta cá. Vì vậy, cảm ơn bạn một lần nữa.
Agmenor

6

Đây là mã cuối cùng đã làm việc. Vì nó phụ thuộc nhiều vào môi trường phát triển của tôi Nhanh chóng + Glade + Python + Gtk, tôi làm cho nó trở thành một câu trả lời độc lập. Câu trả lời của Bryce đã giúp rất nhiều, và trao đổi của tôi với aking1012 cũng vậy .

Mã thực tế, trong một trình soạn thảo văn bản:

# 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."

Trong Glade, tôi đã tạo một GtkEntry có tên là "entry1" trong cửa sổ của mình có tên là "Discvur_window". Trong tab 'Tín hiệu', tôi đã đưa ra tín hiệu "backspace" một trình xử lý có tên là "on_erasing".

Bây giờ, nhấn Backspacehoặc Ctrl+ Blàm cho thiết bị đầu cuối in "Nó hoạt động.".


Điều này có thể được sử dụng để vô hiệu hóa phím tắt Ctrl + F4 để đóng cửa sổ không?
Juzer Ali

Ý bạn là Alt + F4? Tôi không biết, tôi đã không thử.
Agmenor

Ý tôi là cả Ctrl + F4 và Alt + F4
Juzer Ali

2

Tôi đã đóng gói lại các câu trả lời trong chủ đề này thành một ví dụ độc lập:

#!/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()

Cũng có sẵn dưới dạng ý chính: https://gist.github.com/thorsummoner/230bed5bbd3380bd5949

Lưu ý: Tín hiệu mặc định là clicked, không phải activateỨng dụng không bao giờ nên kết nối với ::activatetín hiệu mà sử dụng ::clickedtín hiệu Gtk.Button .


Vì vậy, tôi nhận thấy; khi sử dụng clickedmáy gia tốc có thể được nghiền rất nhanh, nhưng nút không bị giảm thị lực. Khi sử dụng activate, nút sẽ ấn xuống, nhưng chỉ có thể nhấn nút tăng tốc sau khi hoàn thành việc giảm thị giác.
ThorSummoner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.