2015-09-22 4 views
2

Я использую Gtk (python3) + Glade для создания приложения. Я установил некоторые акселераторы в поляне, как это:Изменение ускорителя Gtk, установленного по поляне

<child> 
    <object class="GtkImageMenuItem" id="imagemenuitem5"> 
     <property name="label">gtk-quit</property> 
     <accelerator key="q" signal="activate" modifiers="GDK_CONTROL_MASK"/> 
    </object> 
</child> 

Но я не понимаю, как я могу изменить ускоритель для этого события на что-то еще в то время как приложение работает. Является ли это возможным? Является ли моя реализация неправильной для того, что я планирую делать?

+0

Возможно, 'gtk_widget_remove_accelerator()', за которым следует 'gtk_widget_add_accelerator()'? – ace

ответ

2

Элемент <accelerator> использует gtk_widget_add_accelerator() внутренне. Из документации по этой функции:

Ускорители, добавленные через эту функцию, не могут быть изменены пользователем во время работы. Если вы хотите поддерживать ускорители, которые могут быть изменены пользователем, используйте вместо этого gtk_accel_map_add_entry() и gtk_widget_set_accel_path() или gtk_menu_item_set_accel_path().

На самом деле есть еще более современный способ сделать это, чем, используя GAction, GApplication и GMenuModel, без создания каких-либо меню баров на всех. Вот пример изменения ускорителей пункта меню во время выполнения:

from gi.repository import Gio, Gtk 


class App(Gtk.Application): 
    def __init__(self, **props): 
     super(App, self).__init__(application_id='org.gnome.example', 
      flags=Gio.ApplicationFlags.FLAGS_NONE, **props) 
     # Activating the LEP GEX VEN ZEA menu item will rotate through these 
     # accelerator keys 
     self.keys = ['L', 'G', 'V', 'Z'] 

    def do_activate(self): 
     Gtk.Application.do_activate(self) 

     actions = self.create_actions() 
     self.add_action(actions['quit']) 

     self.win = Gtk.ApplicationWindow() 
     self.add_window(self.win) 
     self.win.add_action(actions['lep']) 
     self.set_accels_for_action('win.lep', ['<primary>' + self.keys[0]]) 
     # Ctrl-Q is automatically assigned to an app action named quit 

     model = self.create_menus() 
     self.set_menubar(model) 

     actions['lep'].connect('activate', self.on_lep_activate) 
     actions['quit'].connect('activate', lambda *args: self.win.destroy()) 

     self.win.show_all() 

    def create_actions(self): 
     return {name: Gio.SimpleAction(name=name) for name in ['lep', 'quit']} 

    def create_menus(self): 
     file_menu = Gio.Menu() 
     file_menu.append('LEP GEX VEN ZEA', 'win.lep') 
     file_menu.append('Quit', 'app.quit') 
     menu = Gio.Menu() 
     menu.append_submenu('File', file_menu) 
     return menu 

    def on_lep_activate(self, *args): 
     self.keys = self.keys[1:] + self.keys[:1] 
     self.set_accels_for_action('win.lep', ['<primary>' + self.keys[0]]) 

if __name__ == '__main__': 
    App().run([]) 

Вы можете также сделать некоторые из этого с Glade файлами и подключить его автоматически, создавая menus.ui файл и сделать его доступным для вашего приложения на конкретный путь GResource: это описано here.