2017-01-31 1 views
1

사용자가 실행할 프로그램을 선택할 수있는 GtkAppChooserButton을 갖고 싶습니다.이 프로그램은 pavucontrol과 같은 오디오 믹서 일 가능성이 가장 높습니다. 이 문제에 관한 막연한 문서에도 불구하고, 응용 프로그램 선택기의 콘텐츠 형식이 MIME 형식으로되어 있지만 오디오 믹서 나 일반적으로 "모든 응용 프로그램"에 적합한 MIME 형식을 찾을 수 없습니다.GtkAppChooser 모든 응용 프로그램 및/또는 오디오 믹서의 내용 유형

application/과 같은 일부 유형은 Other... 개의 항목이 활성화되어 있고 두 항목이 동일하고 어느 항목도 오디오 믹서를 포함한 절반의 응용 프로그램을 포함하지 않을 경우 두 개의 Other Application... 옵션을 제공합니다. 그 외에, 내가하는 일 외에 내가 할 수있는 일은 멀리 떨어져있다.

오디오 믹서 또는 일반적으로 모든 프로그램에 대해 MIME 유형 및/또는 GtkAppChooser 콘텐츠 유형 (동일하게 보입니다)이 있습니까? (즉, Gnome app launcher/xfce4-whisker-menu/etc와 같은 아이콘이있는 모든 프로그램)

답변

1

알았어. 솔루션을 찾았으니 깨끗하다고 ​​생각하지 않을거야. 너는 희망했다.

This threadGtkAppChooser을 "모두 표시"하는 방법을 언급했지만 설치 한 모든 응용 프로그램을 실제로 표시하지는 않습니다. 그렇지만 GtkAppChooserGio.AppInfo을 어떻게 사용하고 있는지를 알아 냈습니다. Gio.AppInfo.get_all() (이 파일은 PyObject 용입니다)은 .desktop 파일이 있으면 모든 설치 프로그램에 대해 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] 

이 후 정기적으로 대화와 유사한 실행 완성 된 대화 상자가 너무처럼 보인다 대화 상자를 누르거나 취소를 누르면 결과는 없음이되지만 응용 프로그램을 선택한 경우 run()은를 반환합니다.3210 개체를 응용 프로그램에서 사용할 수 있습니다. 예를 들어, 새로 선택한 응용 프로그램을 실행하려면 다음과 같이하십시오.

application.launch() 

이 도구는 비교적 견고한 해결책이라고 생각하지만 추가 제안을 환영합니다. 또한 Gtk에서이 모든 작업을 수행하지 않고도이 작업을 수행 할 수있는 방법이 있다면 나는 아직도 듣고 싶습니다.

관련 문제