Ứng dụng nhanh chóng với ListStore là ưu tiên


10

Tôi đang bắt đầu viết một chương trình với 'nhanh chóng'. Một danh sách các ngôn ngữ mong muốn sẽ là một ưu tiên. Thí dụ:

languages = ["en", "de"]

Mã nhanh chóng (được tạo tự động) xử lý phần ưu tiên trông như thế này:

# 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'],
}

Trong GUI, có vẻ như tiện ích được chọn trong gtk cho danh sách là ListStore (không phải là tiện ích, mà là mô hình, nhưng được xác định trong tệp Glade ...). Ai đó có thể cho tôi biết những gì sẽ làm việc cho một ListStore cho 'getter', 'setter''changed'trong đoạn code trên?

Cách tiếp cận có vẻ dễ dàng đối với các widget nhập đơn giản và như vậy, nhưng tôi không biết cách sử dụng nó với danh sách.

Ngoài ra, tất nhiên tôi sẽ chấp nhận bất kỳ cách nào khác để xử lý các danh sách dưới dạng tùy chọn, miễn là độ dài của danh sách không cố định.


Không phải là một câu trả lời cho câu hỏi, nhưng tại sao ứng dụng của bạn cần phải chuyển đổi ngôn ngữ? Nó có thể không chỉ đơn giản là sử dụng gettext và ngôn ngữ được xác định bởi người dùng để xác định ngôn ngữ? Đó là cách tiêu chuẩn để đối phó với các bản dịch của ứng dụng: nó sẽ hoạt động tự động và sẽ ít làm việc hơn cho bạn.
David Planella

@DavidPlnella: một câu hỏi hay. Nó không chuyển ngôn ngữ. Ứng dụng tra cứu các tập phim truyền hình trong cơ sở dữ liệu. Vì nhiều người nói nhiều hơn một ngôn ngữ, các tập trong tất cả chúng có thể được truy xuất. Ví dụ: Tôi xem các tập phim truyền hình Đức và Anh.
xubuntix

Câu trả lời:


2

Tuyên bố miễn trừ trách nhiệm: Tôi không biết gì về nó một cách nhanh chóng cho đến khi tôi đọc bài viết của bạn hoặc về lập trình gui nói chung cho vấn đề đó. Vì vậy, tôi thành thật không có doanh nghiệp cố gắng trả lời câu hỏi này :)

Điều đó nói rằng, nhanh chóng là một dự án gọn gàng. Tôi đã quét sơ lược nguồn soạn sẵn và xác định các cách tiếp cận tiềm năng sau để thêm tùy chọn kiểu danh sách được hỗ trợ ListStore:

  1. 'Monkey-patch' lấy và đặt widget_methods vào một tiện ích TreeView cổ (mô hình w / ListStore) như được định nghĩa trong dữ liệu / ui / Preferences $ PRO DỰNAME $ Dialog.ui với glade.
  2. Triển khai set_widget_from_preferenceset_preferencetrong lớp con của PreferencesDialog của dự án (lớp con là Tùy chọn $ PRO DỰNAME $ Dialog) và làm một cái gì đó khác biệt khi keyhoặc widgetlà tiện ích TreeView được ListStore hỗ trợ.
  3. Viết một lớp con tùy chỉnh của gtk.TreeView với một tiện ích tùy chỉnh phù hợp cho glade .

Để kiểm tra chúng, tôi đã thực hiện cả ba ý tưởng này - mỗi ý tưởng đều hoạt động như dự định và AFAICT, giống hệt nhau. Cuối cùng, thứ ba (đặc biệt) có vẻ sạch sẽ nhất đối với tôi, và gần hơn với các quy ước được sử dụng trong suốt bản tóm tắt, mặc dù ban đầu mong đợi điều ngược lại.


Dưới đây là các bước tôi làm theo cho số ba ...

Sử dụng glade qua quickly design(nhanh chóng 11.10, btw) và làm theo hướng dẫn này một cách lỏng lẻo (phần 2) , thêm tiện ích ScrolledWindow vào Tùy chọn $ PRO DỰNAME $ Dialog.ui, thả TreeView vào đó, đặt tên cho TreeView language_treeview. Tạo một mô hình ListStore mới cho TreeView khi được nhắc và đặt tên là ngôn ngữ_liststore, v.v ... cuối cùng tôi đã kết thúc với một cái gì đó như thế này:

tính chất glade

Tiếp theo, thêm một danh mục glade (data / ui / Preferences_ $ PRO DỰNAME $ _treeview.xml) với các nội dung sau:

<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>

Sau đó, chỉnh sửa Tùy chọn $ PRO DỰNAME $ Dialog.ui, thêm ...

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

... lên trên cùng, dưới thẻ yêu cầu. Và thay đổi thuộc tính lớp của Language_treeview thành Preferences $ PRO DỰNAME $ TreeView, để chuẩn bị cho bước sau.

Cuối cùng, thêm phần tử sau vào danh sách widget_methods trong Tùy chọn $ PRO DỰNAME $ Dialog.py

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

Và ở cuối cùng một tệp (Tùy chọn $ PRO DỰNAME $ Dialog.py), hãy thêm

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

Nếu bạn muốn thấy những nỗ lực của tôi cho một và hai, tôi rất vui khi bắt buộc.

Chỉnh sửa: Đối với người đọc thông thường, thay thế bất kỳ sự xuất hiện nào của $ PRO DỰNAME $ bằng tên thực tế của dự án nhanh chóng của bạn (như được chỉ định trong quickly create).

HTH!


Điều này hoạt động rất tốt và có vẻ khá rõ ràng, vì vậy hai lần thử khác là không cần thiết, nhưng cảm ơn bạn một lần nữa vì đã thử chúng ... Vì câu trả lời của bạn rất dài nhưng vẫn rõ ràng, bạn có thể muốn mở rộng nó thành một hướng dẫn hoàn chỉnh ở đây: developer.ubfox.com/resource/tutorials/all Dù sao: cảm ơn một lần nữa!
xubuntix

@xubuntix Đó là một ý tưởng thú vị, tôi sẽ xem xét nó. Cảm ơn các liên kết và các đại diện!
mwalsh

0

Bản thân tôi đã không thử 'nhanh chóng', nhưng với kinh nghiệm GTK của mình, tôi sẽ sử dụng Nút radio để xử lý lựa chọn ngôn ngữ.

Xem toggledsự kiện cùng với button.get_active()phương pháp là đủ để kiểm tra những gì người dùng đã chọn.


Theo đề nghị của bạn, tôi đã xem lại các Nút Radio nhưng điều đó có vẻ không lý tưởng: Vì danh sách các ngôn ngữ có thể dài hơn rất nhiều sau đó có thể được cung cấp bởi Nút Radio, nên lựa chọn duy nhất là có một tiện ích riêng có thêm nút radio, và tất cả các radiobutton luôn hoạt động. Điều đó dường như không tốt đẹp.
xubuntix

Hãy chắc chắn rằng bạn đang sử dụng các nhóm radio đúng cách. Ngoài ra, toggledsự kiện có thể được sử dụng cho cả các nút được chọn và không được chọn, đó là lý do tại sao nó là đủ.
Alexandre

Ý tôi là: có 200 nút radio không phải là giao diện người dùng tốt. Những gì tôi cần là một cách để lưu trữ một danh sách nơi các mặt hàng có thể được thêm và xóa theo yêu cầu.
xubuntix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.