ListStore를 기본으로 사용하여 빠르게 적용

ListStore를 기본으로 사용하여 빠르게 적용

나는 'quickly'로 프로그램을 작성하기 시작했습니다. 원하는 언어 목록이 가장 선호됩니다. 예:

languages = ["en", "de"]

기본 설정 부분을 처리하는 (자동으로 생성된) 빠른 코드는 다음과 같습니다.

# Define your preferences dictionary in the __init__.main() function.
# The widget names in the PreferencesTestProjectDialog.ui
# file need to correspond to the keys in the preferences dictionary.
#
# Each preference also need to be defined in the 'widget_methods' map below
# to show up in the dialog itself.  Provide three bits of information:
#  1) The first entry is the method on the widget that grabs a value from the
#     widget.
#  2) The second entry is the method on the widget that sets the widgets value
#      from a stored preference.
#  3) The third entry is a signal the widget will send when the contents have
#     been changed by the user. The preferences dictionary is always up to
# date and will signal the rest of the application about these changes.
# The values will be saved to desktopcouch when the application closes.
#
# TODO: replace widget_methods with your own values


widget_methods = {
    'languages': ['getter', 'setter', 'changed'],
}

GUI에서는 목록에 대해 gtk에서 선택한 위젯이 ListStore인 것처럼 보입니다(위젯은 아니지만 모델이지만 Glade 파일에 정의되어 있습니다...). 누군가가 위 의 코드에서 ListStore에 대해 작동하는 것이 무엇인지 말해 줄 수 있습니까 'getter'?'setter''changed'

간단한 입력 위젯 등에 대한 접근 방식은 쉬워 보이지만 목록과 함께 사용하는 방법을 모르겠습니다.

또는 목록의 길이가 고정되어 있지 않다면 목록을 기본 설정으로 처리하는 다른 방법을 받아들이겠습니다.

답변1

면책 조항 : 나는 아무것도 몰랐습니다빠르게귀하의 게시물을 읽을 때까지 또는 그 문제에 대한 일반적인 GUI 프로그래밍에 대해. 그러므로 나는 솔직히 이 질문에 대답하려고 시도할 필요가 없습니다. :)

즉,빠르게깔끔한 프로젝트다. 상용구 소스를 간략하게 스캔하고 ListStore 지원 목록 스타일 기본 설정을 추가하기 위한 다음과 같은 잠재적 접근 방식을 식별했습니다.

  1. 'Monkey-patch'는 Glade를 사용하여 data/ui/Preferences$PROJECTNAME$Dialog.ui에 정의된 대로 widget_methods를 기본 TreeView 위젯(ListStore 모델 포함)으로 가져오고 설정합니다.
  2. 프로젝트의 PreferencesDialog 하위 클래스(하위 클래스는 Preferences$PROJECTNAME$Dialog)에서 구현하고 set_widget_from_preferenceListStore 가 지원하는 TreeView 위젯일 때 또는 그럴 때 다른 작업을 수행합니다.set_preferencekeywidget
  3. 일치하는 gtk.TreeView의 사용자 정의 하위 클래스를 작성하세요.Glade용 맞춤 위젯.

테스트하기 위해 세 가지 아이디어를 모두 구현했습니다. 각각은 의도한 대로 작동했고 AFAICT는 동일하게 작동했습니다. 결국, 처음에는 반대를 예상했음에도 불구하고 세 번째(특히)가 나에게 가장 깨끗하고 상용구 전체에 사용된 규칙에 더 가까운 것처럼 보였습니다.


세 번째 단계를 수행한 단계는 다음과 같습니다.

Glade via quickly design(빠르게 11.10, btw)를 사용하고 느슨하게 따르기이 튜토리얼(2부), Preferences$PROJECTNAME$Dialog.ui에 ScrolledWindow 위젯을 추가하고 그 위에 TreeView를 놓고 TreeView라는 이름을 지정합니다 language_treeview. 메시지가 표시되면 TreeView에 대한 새 ListStore 모델을 만들고 이름을 Language_liststore 등으로 지정합니다. 결국 다음과 같은 결과가 나왔습니다.

글레이드 속성

다음으로 다음 내용이 포함된 글레이드 카탈로그(data/ui/preferences_$PROJECTNAME$_treeview.xml)를 추가합니다.

<glade-catalog name="preferences_$PROJECTNAME$_treeview" domain="glade-3"
               depends="gtk+" version="1.0">
  <glade-widget-classes>
    <glade-widget-class title="$PROJECTNAME$ Preferences TreeView" name="Preferences$PROJECTNAME$TreeView"
                        generic-name="Preference$PROJECTNAME$TreeView" parent="GtkTreeView"
                        icon-name="widget-gtk-treeview"/>
  </glade-widget-classes>
</glade-catalog>

그런 다음 Preferences$PROJECTNAME$Dialog.ui를 편집하고 다음을 추가합니다.

<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->

... 상단의 require 태그 아래에 있습니다. 그리고 이후 단계를 준비하기 위해 Language_treeview의 클래스 속성을 Preferences$PROJECTNAME$TreeView로 변경합니다.

마지막으로 Preferences$PROJECTNAME$Dialog.py의 widget_methods 목록에 다음 요소를 추가합니다.

'language_treeview': ['get_languages', 'set_languages', 'button-release-event']

그리고 동일한 파일(Preferences$PROJECTNAME$Dialog.py) 끝에 다음을 추가합니다.

import gtk

ALL_LANGUAGES = [
  'en', 'uk', 'de', 'fr', # ... much longer list
]

class Preferences$PROJECTNAME$TreeView(gtk.TreeView):
    __gtype_name__ = "Preferences$PROJECTNAME$TreeView"

    def __init__(self, *args):
        super(Preferences$PROJECTNAME$TreeView, self).__init__(*args)
        self.get_selection().set_mode(gtk.SELECTION_MULTIPLE)

    # loads the liststore with all languages, 
    # selecting/highlighting in the treeview those 
    # already retrieved from previously saved preferences
    def set_languages(self, preferred_languages):
        model = self.get_model()
        for row, lang in enumerate(ALL_LANGUAGES):
            model.append([lang])
            if lang in preferred_languages:
                self.get_selection().select_iter(model.get_iter(row))

    # collects only the selected languages in the treeview
    # to save in the preferences database
    def get_languages(self):
        model, rows = self.get_selection().get_selected_rows()
        result = [model.get_value(model.get_iter(row), 0) for row in rows]
        return result

1번과 2번에 대한 나의 시도를 보고 싶으시다면 기꺼이 응하겠습니다.

편집하다:일반 독자의 경우 다음 항목을 모두 바꾸십시오.$PROJECTNAME$실제 이름으로빠르게프로젝트(에 지정된 대로 quickly create).

HTH!

답변2

나는 '빠르게' 시도하지는 않았지만 GTK 경험을 바탕으로라디오 버튼언어 선택을 처리합니다.

toggled메소드 와 함께 이벤트를 시청하는 것만으로 button.get_active()도 사용자가 선택한 것을 확인할 수 있을 것입니다.

관련 정보