선호 사항으로 ListStore를 사용하여 빠르게 적용


10

'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'위의 코드에서?

이 방법은 간단한 항목 위젯 등에서는 쉽지만 목록과 함께 사용하는 방법을 모르겠습니다.

또는 목록의 길이가 고정되어 있지 않다면 목록을 기본 설정으로 처리하는 다른 방법을 허용합니다.


질문에 대한 답변은 아니지만 왜 앱에서 언어를 전환해야합니까? 단순히 gettext와 사용자 정의 로케일을 사용하여 언어를 결정할 수 있습니까? 이것이 응용 프로그램의 번역을 처리하는 표준 방법입니다. 자동으로 작동하고 훨씬 덜 작동합니다.
David Planella

@DavidPlnella : 좋은 질문입니다. 언어를 바꾸지 않습니다. 이 앱은 데이터베이스에서 TV 에피소드를 조회합니다. 많은 사람들이 하나 이상의 언어를 사용하기 때문에 모든 언어의 에피소드를 검색 할 수 있습니다. 예 : 독일어 및 영어 TV 에피소드를 봅니다.
xubuntix

답변:


2

면책 조항 : 나는 대해 아무것도 몰랐 신속을 내가, 또는 그 문제에 관해서는 일반적으로 GUI 프로그래밍에 대한 귀하의 게시물을 읽을 때까지. 따라서 나는 솔직히이 질문에 대답하려고하는 사업이 없습니다 :)

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

  1. 'Monkey-patch'는 glade를 사용하여 data / ui / Preferences $ PROJECTNAME $ Dialog.ui에 정의 된대로 스톡 TreeView 위젯 (ListStore 모델 포함)에 widget_methods를 가져오고 설정합니다.
  2. 프로젝트의 PreferencesDialog (하위 클래스는 Preferences $ PROJECTNAME $ Dialog)의 하위 클래스에서 구현 set_widget_from_preference하고 ListStore가 지원하는 TreeView 위젯 일 set_preferencekey또는 다른 경우에 다른 작업을 수행 widget하십시오.
  3. glade에 맞는 사용자 정의 위젯 으로 gtk.TreeView의 사용자 정의 서브 클래스를 작성하십시오 .

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


여기에 세 번째 단계를 수행 한 단계가 있습니다 ...

glade via quickly design(빠른 11.10, btw) 를 사용 하고이 튜토리얼 (2 부)을 느슨하게 따라서 ScrolledWindow 위젯을 Preferences $ PROJECTNAME $ Dialog.ui에 추가하고 TreeView를 그 위에 놓고 TreeView 이름을 지정하십시오 language_treeview. 프롬프트가 표시되면 TreeView에 대한 새 ListStore 모델을 작성하고 language_liststore 등으로 이름을 지정하십시오. 결국 다음과 같이 끝났습니다.

빈터 속성

다음 내용으로 glade 카탈로그 (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 -->

... (요구 사항 태그 아래) 그리고 나중 단계를 준비하기 위해 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

하나와 둘에 대한 나의 시도를 보는 데 관심이 있다면 나는 기꺼이 순종한다.

편집 : 일반 독자의 경우 $ PROJECTNAME $신속 프로젝트 의 실제 이름으로 바꾸십시오 (에 지정된대로 quickly create).

HTH!


이것은 매우 잘 작동하고 분명해 보이므로 다른 두 번의 시도는 필요하지 않지만 시도해 주셔서 다시 한 번 감사드립니다. 대답은 매우 길지만 여전히 명확하므로 여기에서 완전한 자습서로 확장하고 싶을 수 있습니다. developer.ubuntu.com/resources/tutorials/all 어쨌든 : 다시 한번 감사합니다!
xubuntix

@xubuntix 흥미로운 아이디어입니다. 살펴 보겠습니다. 링크와 담당자에 감사드립니다!
mwalsh

0

나는 '빠른'자신을 시도하지는 않았지만 GTK 경험으로 라디오 버튼 을 사용 하여 언어 선택을 처리했습니다.

방법 toggled과 함께 이벤트를 시청하면 button.get_active()사용자가 선택한 것을 확인하기에 충분해야합니다.


귀하의 제안에 따라 라디오 버튼을 다시 보았지만 이상적이지 않은 것 같습니다. 가능한 언어 목록이 훨씬 길면 라디오 버튼으로 멋지게 줄 수 있기 때문에 유일한 대안은 라디오 버튼을 추가하는 별도의 위젯을 갖는 것입니다. 모든 라디오 버튼은 항상 활성화되어 있습니다. 그렇게 좋지 않은 것 같습니다.
xubuntix

라디오 그룹을 올바르게 사용하고 있는지 확인하십시오. 또한 toggled이벤트는 선택된 버튼과 선택되지 않은 버튼 모두에 사용할 수 있으므로 충분해야합니다.
Alexandre

내 말은 200 개의 라디오 버튼을 갖는 것은 좋은 사용자 인터페이스가 아닙니다. 내가 필요한 것은 주문형 항목을 추가하고 제거 할 수있는 목록을 저장하는 방법입니다.
xubuntix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.