면책 조항 : 나는 대해 아무것도 몰랐 신속을 내가, 또는 그 문제에 관해서는 일반적으로 GUI 프로그래밍에 대한 귀하의 게시물을 읽을 때까지. 따라서 나는 솔직히이 질문에 대답하려고하는 사업이 없습니다 :)
즉, 빨리 깔끔한 프로젝트입니다. 상용구 소스를 간략하게 스캔하고 ListStore 지원 목록 스타일 환경 설정을 추가하기위한 다음과 같은 잠재적 인 접근 방식을 식별했습니다.
- 'Monkey-patch'는 glade를 사용하여 data / ui / Preferences $ PROJECTNAME $ Dialog.ui에 정의 된대로 스톡 TreeView 위젯 (ListStore 모델 포함)에 widget_methods를 가져오고 설정합니다.
- 프로젝트의 PreferencesDialog (하위 클래스는 Preferences $ PROJECTNAME $ Dialog)의 하위 클래스에서 구현
set_widget_from_preference
하고 ListStore가 지원하는 TreeView 위젯 일 set_preference
때 key
또는 다른 경우에 다른 작업을 수행 widget
하십시오.
- 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!