2017-01-31 5 views
1

gtkAppChooserButtonを使用して、実行するプログラムを選択することができます。このプログラムは、pavucontrolなどのオーディオミキサーになりがちです。この問題に関する曖昧な文書にもかかわらず、私はアプリケーションセレクタのコンテンツタイプがMIMEタイプであることを意図していますが、オーディオミキサー、またはより一般的には「すべてのアプリケーション」に適したMIMEタイプは見つかりません。GtkAppChooserすべてのアプリケーションおよび/またはオーディオミキサーのコンテンツタイプ

application/などの一部のタイプでは、Other...アイテムが有効になっている場合、2つのオプションが与えられます。どちらも同一であり、どちらもオーディオミキサーを含むアプリケーションの半分を含んでいません。それ以外に、私がやっているものに遠く離れて私を得ることはほかにありません。

オーディオミキサーまたは一般的なすべてのプログラムのMIMEタイプまたはGtkAppChooserコンテンツタイプ(同じものと思われる)がありますか? (つまり、Gnome appランチャー/ xfce4-whisker-menu/etcのアイコンを持つプログラム)

答えて

1

申し訳ありませんが、私は解決策を考え出しました。あなたは望みました。

This threadにはGtkAppChooserを「すべて表示」にする方法が記載されていますが、実際にインストールしたすべてのアプリケーションは表示されません。しかし、それでGtkAppChooserGio.AppInfoをどのように使用しているのかを調べることができました。Gio.AppInfo.get_all()(これはPyObject用です)は、私がインストールしたすべてのアプリケーションのGio.AppInfosの全リストを返すものです。

私の "解決策"は、Gio.AppInfo.get_all()からアプリのリストを取得する自分のアプリチューザを作成することです。

私はこれまでの私の解決策を取り除き、より多くのカスタマイズを与えるGtk.Dialogを継承するためのクラス 'AllAppChooser'を作成しました。ユーザーが終了した場合

app_chooser = AllAppChooser() 
application = app_chooser.run() 

enter image description here

、使用コード:

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, Gio 


class AllAppChooser(Gtk.Dialog): 
    """Provide a dialog to select an app from all those installed. 

    The regular Gtk.AppChooserDialog does not seem to provide any way to allow 
    selection from all installed apps, so this dialog serves as a replacement. 

    """ 
    def __init__(self, parent=None): 
     super().__init__(self) 

     self.set_default_size(350, 400) 
     self.set_icon_name('gtk-search') 
     self.set_title('App Chooser') 
     if parent: 
      self.set_parent(parent) 

     self.content_box = self.get_content_area() 
     self.content_box.set_margin_left(8) 
     self.content_box.set_margin_right(8) 
     self.content_box.set_margin_top(8) 
     self.content_box.set_margin_bottom(8) 
     self.content_box.set_spacing(8) 

     self.button_box = self.get_action_area() 
     self.button_box.set_margin_left(4) 
     self.button_box.set_margin_right(4) 
     self.button_box.set_margin_top(4) 
     self.button_box.set_margin_bottom(4) 

     self.label = Gtk.Label('Choose An Application') 
     self.content_box.pack_start(self.label, False, False, 0) 

     self.list_store = Gtk.ListStore(str, str, int) 

     pixbuf_renderer = Gtk.CellRendererPixbuf() 
     text_renderer = Gtk.CellRendererText() 
     icon_column = Gtk.TreeViewColumn('icon', pixbuf_renderer, icon_name=1) 
     text_column = Gtk.TreeViewColumn('text', text_renderer, text=0) 

     self.tree_view = Gtk.TreeView() 
     self.tree_view.set_model(self.list_store) 
     self.tree_view.set_headers_visible(False) 
     self.tree_view.append_column(icon_column) 
     self.tree_view.append_column(text_column) 

     self.view_port = Gtk.Viewport() 
     self.view_port.add(self.tree_view) 

     self.scroll_window = Gtk.ScrolledWindow() 
     self.scroll_window.add(self.view_port) 
     self.content_box.pack_start(self.scroll_window, True, True, 0) 

     self.ok_button = self.add_button(Gtk.STOCK_OK, 1) 
     self.ok_button.connect('clicked', self.on_ok) 

     self.cancel_button = self.add_button(Gtk.STOCK_CANCEL, 0) 

     self.selected_app = None 
     self.app_list = [] 

    def populate_app_list(self): 
     """Populate the list of apps with all installed apps. 

     Icons are provided by icon-name, however some apps may return a full 
     path to a custom icon rather than a themed-icon name, or even no name 
     at all. In these cases the generic 'gtk-missing-icon' icon is used. 

     """ 
     self.app_list = Gio.AppInfo.get_all() 
     for i in range(len(self.app_list)): 
      gio_icon = self.app_list[i].get_icon() 
      app_icon = 'gtk-missing-icon' 
      if gio_icon: 
       app_icon = gio_icon.to_string() 
      app_name = self.app_list[i].get_display_name() 
      self.list_store.append([app_name, app_icon, i]) 

     self.list_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 

    def run(self): 
     """Run the dialog to get a selected app.""" 
     self.populate_app_list() 
     self.show_all() 
     super().run() 
     self.destroy() 
     return self.selected_app 

    def set_label(self, text): 
     """Set the label text, \"Choose An App\" by default.""" 
     self.label.set_text(text) 

    def on_ok(self, button): 
     """Get Gio.AppInfo of selected app when user presses OK.""" 
     selection = self.tree_view.get_selection() 
     tree_model, tree_iter = selection.get_selected() 
     app_index = tree_model.get_value(tree_iter, 2) 
     self.selected_app = self.app_list[app_index] 

これは、その後、通常のダイアログに似て実行されて完了ダイアログがそうのようになります。ダイアログボックスを押すかキャンセルを押すと結果はNoneになりますが、アプリケーションを選択した場合はrun()はを返します3210オブジェクトをアプリケーションのために使用してください。私は、これは今比較的固溶体であると感じ、私はまだ追加の提案を歓迎

application.launch() 

:たとえば、新しく選択したアプリケーションを起動します。さらに、Gtkでこれを行う方法があれば、このようなことをすべて行う必要はなく、私はまだそれを聞きたいです。

関連する問題