2013-10-20 6 views
6

は、私はそれが(ジオから)GActionsを使用しますので、GObjectのインストロペを使用してのpython3でGtkActionsのとは対照的に、私のGtkアプリでメニューバーを変換しようとしています。PyGI GTKでGIOアクションを使用して完全なメニューを作成するには?

私は自分自身でそれを理解しようとしてきたこれまでのところ、それはひどく複雑なようで、私はそれで多くの幸運を持っていませんでした。

誰かが

  • サブメニュー
  • 在庫IDのアイコン/ホットキー
  • とメニュー項目とメニュー項目に基づいて、シンプルなメニューGActionを作成する方法の例を投稿してください可能性がある場合非在庫アイコン/ホットキー
  • Aがメニュー項目をチェックし
  • とラジオメニュー項目グループ
  • 無効(グレー表示O UT)メニュー項目

それは本当に私をたくさん役立つだろう。

EDIT:これは私が今、私の窓を持っているメニューバーです。

enter image description here

誰かがGioActionsを使用して示すメニュー項目を複製することができれば、それはので、私は、彼らは希望それをどのように機能するかを見つけ出すことができます素晴らしいよところで

、私が使用ウィンドウのコールバックではないアプリコールバックを持っているので、これはウィンドウのメニューバーではないアプリのメニューバーであるすべてのアクション。

答えて

7

メニューバーが追加されました。

#!/usr/bin/env python3 

# Copyright (C) 2013 LiuLang <[email protected]> 

# Use of this source code is governed by GPLv3 license that can be found 
# in http://www.gnu.org/licenses/gpl-3.0.html 

from gi.repository import Gio 
from gi.repository import Gtk 
import sys 

menus_str =''' 
<?xml version="1.0"?> 
<interface> 
    <menu id="appmenu"> 
    <section> 
     <item> 
     <attribute name="label" translatable="yes">Preferences</attribute> 
     <attribute name="action">app.preferences</attribute> 
     </item> 
    </section> 
    <section> 
     <item> 
     <attribute name="label" translatable="yes">About</attribute> 
     <attribute name="action">app.about</attribute> 
     </item> 
     <item> 
     <attribute name="label" translatable="yes">Quit</attribute> 
     <attribute name="action">app.quit</attribute> 
     <attribute name="accel">&lt;Primary&gt;q</attribute> 
     </item> 
    </section> 
    </menu> 
    <menu id="menubar"> 
    <submenu> 
     <attribute name="label">_Help</attribute> 
     <section> 
     <item> 
       <attribute name="label">_About</attribute> 
       <attribute name="action">app.about</attribute> 
      </item> 
      </section> 
     </submenu> 
     </menu> 
    </interface> 
    ''' 

    class App: 
     def __init__(self): 
      self.app = Gtk.Application.new('org.liulang.test', 0) 
      self.app.connect('startup', self.on_app_startup) 
      self.app.connect('activate', self.on_app_activate) 
      self.app.connect('shutdown', self.on_app_shutdown) 

     def run(self, argv): 
      self.app.run(argv) 

     def on_app_startup(self, app): 
      self.window = Gtk.ApplicationWindow.new(app) 
      self.window.set_default_size(640, 480) 
      self.window.set_title('Gio Actions Demo') 
      self.window.set_border_width(5) 
      # no need to connect delete-event/destroy signal 

      app.add_window(self.window) 

      label = Gtk.Label('Hello, Gtk3') 
      self.window.add(label) 
      label.props.halign = Gtk.Align.CENTER 
      label.props.valign = Gtk.Align.CENTER 

      builder = Gtk.Builder() 
      # It is better to load ui from a seperate file 
      builder.add_from_string(menus_str) 
      builder.connect_signals(self) 
      appmenu = builder.get_object('appmenu') 
      app.set_app_menu(appmenu) 
      menubar = builder.get_object('menubar') 
      app.set_menubar(menubar) 

      self.add_simple_action('preferences', 
        self.on_action_preferences_activated) 
      self.add_simple_action('about', self.on_action_about_activated) 
      self.add_simple_action('quit', self.on_action_quit_activated) 

     def on_app_activate(self, app): 
      self.window.show_all() 

     def on_app_shutdown(self, app): 
      # do some cleaning job here, like dumping configuration. 
      pass 

     def on_action_preferences_activated(self, action, user_data): 
      print('will popup preferences dialog') 

     def on_action_about_activated(self, action, user_data): 
      print('will show about dialog') 

     def on_action_quit_activated(self, action, user_data): 
      # This will close the default gtk mainloop 
      self.app.quit() 

     def add_simple_action(self, name, callback): 
      action = Gio.SimpleAction.new(name, None) 
      action.connect('activate', callback) 
      self.app.add_action(action) 


    if __name__ == '__main__': 
     app = App() 
     app.run(sys.argv) 
+0

新しい回答を投稿するのではなく、前の回答を編集するだけです。また、チェックメニュー項目やラジオメニュー項目は含まれません。 :S – OdraEncoded

+4

ああ、さあ。私はあなたのためにアプリ全体を書く必要がありますか? – LiuLang

関連する問題