알았어. 솔루션을 찾았으니 깨끗하다고 생각하지 않을거야. 너는 희망했다.
This thread은 GtkAppChooser
을 "모두 표시"하는 방법을 언급했지만 설치 한 모든 응용 프로그램을 실제로 표시하지는 않습니다. 그렇지만 GtkAppChooser
이 Gio.AppInfo
을 어떻게 사용하고 있는지를 알아 냈습니다. Gio.AppInfo.get_all()
(이 파일은 PyObject 용입니다)은 .desktop 파일이 있으면 모든 설치 프로그램에 대해 Gio.AppInfos의 전체 목록을 반환합니다.
내 "솔루션"은 Gio.AppInfo.get_all()
에서 앱 목록을 가져 오는 내 자신의 앱 선택기를 작성하는 것입니다.
나는 이것에 대한 나의 이전 해결책을 정리하고 더 많은 커스터마이즈를 제공하는 Gtk.Dialog
을 상속하는 'AllAppChooser'클래스를 작성했다. 사용자가를 종료하는 경우
app_chooser = AllAppChooser()
application = app_chooser.run()
:
그리고 사용되는 코드 :
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에서이 모든 작업을 수행하지 않고도이 작업을 수행 할 수있는 방법이 있다면 나는 아직도 듣고 싶습니다.