剪切,复制,粘贴,选择所有功能-单击菜单项后如何简单地允许默认处理?

问题描述 投票:0回答:1

“ Ctrl + C”和“ Ctrl + V”快捷键(以及“右键单击菜单”)默认在任何GTK应用程序中都可用,例如,仅具有SourceView的简单hello world应用程序(请参见下文) 。但是,如果我添加菜单项“ Edit-> Copy”并为其分配“ Ctrl + C”加速器和相应的回调函数,则由于我用自己的方法拦截了信号,因此它显然停止了工作。因此,如何在我的自定义方法中触发默认的剪切/复制/粘贴/ select_all功能?

注意:返回False适用于粘贴功能,但不适用于复制/剪切/全选

简单示例-在这种情况下,所有功能(剪切/复制/粘贴/全选)都可以正常工作。

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('GtkSource', '3.0') 
from gi.repository import Gtk, Gdk, Pango, GObject, GtkSource

class MyOwnApp(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Hello World")
        self.set_default_size(500, 500)

        self.vbox = Gtk.VBox()

        editor = GtkSource.View.new()
        editor.set_show_line_numbers(True)
        editor.set_auto_indent(True)
        editor_buffer = editor.get_buffer()
        self.vbox.pack_start(editor, False, False, 0)

        self.add(self.vbox)

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

如果我添加带有回调的菜单项,它们将不再起作用。

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('GtkSource', '3.0')
from gi.repository import Gtk, Gdk, Pango, GObject, GtkSource

class MyOwnApp(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Hello World")

        self.set_default_size(900, 900)

        box_outer = Gtk.VBox()

        # MENUBAR setup
        menuBar = Gtk.MenuBar()
        # Set accelerators
        agr = Gtk.AccelGroup()
        self.add_accel_group(agr)

        # File menu
        file_menu_dropdown = Gtk.MenuItem("File")
        menuBar.append(file_menu_dropdown)
        file_menu = Gtk.Menu()
        file_menu_dropdown.set_submenu(file_menu)

        # File menu Items
        file_exit = Gtk.MenuItem("Exit")
        key, mod = Gtk.accelerator_parse("<Control>Q")
        file_exit.add_accelerator("activate", agr, key, mod, Gtk.AccelFlags.VISIBLE)
        file_exit.connect("activate", self.quit)

        file_menu.append(file_exit)

        # Edit menu
        edit_menu_dropdown = Gtk.MenuItem("Edit")
        menuBar.append(edit_menu_dropdown)
        edit_menu = Gtk.Menu()
        edit_menu_dropdown.set_submenu(edit_menu)

        # Edit menu Items
        edit_cut = Gtk.MenuItem("Cut")
        key, mod = Gtk.accelerator_parse("<Control>X")
        edit_cut.add_accelerator("activate", agr, key, mod, Gtk.AccelFlags.VISIBLE)
        edit_cut.connect("activate", self.on_toolbutton_cut_clicked)

        edit_copy = Gtk.MenuItem("Copy")
        key, mod = Gtk.accelerator_parse("<Control>C")
        edit_copy.add_accelerator("activate", agr, key, mod, Gtk.AccelFlags.VISIBLE)
        edit_copy.connect("activate", self.on_toolbutton_copy_clicked)

        edit_paste = Gtk.MenuItem("Paste")
        key, mod = Gtk.accelerator_parse("<Control>V")
        edit_paste.add_accelerator("activate", agr, key, mod, Gtk.AccelFlags.VISIBLE)
        edit_paste.connect("activate", self.on_toolbutton_paste_clicked)

        edit_select_all = Gtk.MenuItem("Select All")
        key, mod = Gtk.accelerator_parse("<Control>A")
        edit_select_all.add_accelerator("activate", agr, key, mod, Gtk.AccelFlags.VISIBLE)
        edit_select_all.connect("activate", self.on_toolbutton_select_all_clicked)

        edit_menu.append(edit_select_all)
        edit_menu.append(edit_cut)
        edit_menu.append(edit_copy)
        edit_menu.append(edit_paste)

        box_outer.pack_start(menuBar, False, False, 0)

        # SourceView
        editor = GtkSource.View.new()
        editor.set_show_line_numbers(True)
        editor.set_auto_indent(True)
        editor_buffer = editor.get_buffer()
        box_outer.pack_start(editor, True, True, 0)

        self.add(box_outer)

    def quit(self,widget=None):
        Gtk.main_quit()

    def on_toolbutton_select_all_clicked(self, widget):
        return False

    def on_toolbutton_cut_clicked(self, widget):
        return False

    def on_toolbutton_copy_clicked(self, widget):
        return False

    def on_toolbutton_paste_clicked(self, widget):
        return False

win = MyOwnApp()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
python clipboard gtk3 pygtk pygobject
1个回答
0
投票

。调用editor_buffer(GtkSourceBuffer)中的特定于动作的函数,这些函数模拟对(剪切/复制/粘贴/全选)的默认处理。 (https://developer.gnome.org/pygtk/stable/class-gtktextbuffer.html)。

    self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
        self.editor_buffer = editor.get_buffer()

def on_toolbutton_select_all_clicked(self, widget):
        print("Select all")
        self.editor_buffer.select_range(self.editor_buffer.get_start_iter(), self.editor_buffer.get_end_iter())
        return False

    def on_toolbutton_cut_clicked(self, widget):
        print("Cut")
        self.editor_buffer.cut_clipboard(self.clipboard,self.editor_buffer)
        return False

    def on_toolbutton_copy_clicked(self, widget):
        self.editor_buffer.copy_clipboard(self.clipboard)
        return False

    def on_toolbutton_paste_clicked(self, widget):
        self.editor_buffer.paste_clipboard(self.clipboard, None, self.editor_buffer)
        return False
© www.soinside.com 2019 - 2024. All rights reserved.