Как обновить ListStrEditor в TraitsUI или другой способ отображения списка в графическом интерфейсе Python?

Я пытаюсь научиться использовать черты для создания простых пользовательских интерфейсов для моих сценариев Python. Я хочу сделать программу со списком, в который пользователь может добавлять слова с помощью одной кнопки или полностью очищать список с помощью другой.

До сих пор я использовал черты:

myList = List(Str)

myList = ['Item1','Item2'] #Initial items in list

Чтобы отобразить этот список в пользовательском интерфейсе свойств, я использовал ListStrEditor из пакета пользовательского интерфейса свойств:

Item('myList', show_label = False, label = 'Data Files', editor = ListStrEditor(auto_add = False)

Я закодировал 2 кнопки: 1) одну для ДОБАВЛЕНИЯ элемента в список (myList.append('item3')) 2) кнопку ОЧИСТИТЬ, чтобы очистить список (myList = []). Базовый пользовательский интерфейс хорош, кнопки работают, и моя переменная списка изменяется, как и ожидалось.

Однако проблема в том, что мой список в графическом интерфейсе не обновляется. Однако, если я нажму на нее, отобразятся новые значения. Кроме того, я хочу потенциально добавить к нему много элементов и задаться вопросом, есть ли способ добавить полосу прокрутки сбоку?

Я просмотрел руководство по использованию ListStrEditor, хотя я немного увяз в терминологии. По-видимому, функция refresh() существует, но я не знаю, как применить ее к ListStrEditor. Кроме того, я не уверен, нужно ли мне использовать вещи, называемые «адаптерами» или «обработчиками».

Любые советы или указатели в правильном направлении будут высоко оценены!


person RobMSN    schedule 09.02.2013    source источник
comment
Можете ли вы включить автономный пример, демонстрирующий проблему?   -  person Warren Weckesser    schedule 09.02.2013


Ответы (1)


Не видя более полного кода, трудно понять, почему ваш код не работает. Возможно, вам не хватает использования self? Например. self.myList.append('Item3') вместо myList.append('Item3')?

Следующее работает для меня. Отображение списка обновляется при нажатии кнопок.

import random

from traits.api import HasTraits, List, Str, Button
from traitsui.api import ListStrEditor, View, UItem


class Demo(HasTraits):

    my_list = List(Str)

    add = Button("ADD")
    clear = Button("CLEAR")

    traits_view = \
        View(
            UItem('my_list', editor=ListStrEditor(auto_add=False)),
            UItem('add'),
            UItem('clear'),
        )

    def _my_list_default(self):
        return ['Item1', 'Item2']

    def _add_fired(self):
        new_item = "Item%d" % random.randint(3, 999)
        self.my_list.append(new_item)

    def _clear_fired(self):
        self.my_list = []


if __name__ == "__main__":
    demo = Demo()
    demo.configure_traits()

Он работает как с бэкендами wx, так и с qt4+pyside. Я использую дистрибутив Python Enthought, EPD 7.3, который имеет версию 4.2.0 Traits и TraitsUI.

Если ваш код значительно отличается, не могли бы вы добавить его к вопросу?

person Warren Weckesser    schedule 09.02.2013
comment
Спасибо, это отлично работает. Это очень похоже на мой код (обратите внимание, я не ответил вовремя, чтобы привести минимальный рабочий пример, извините!), хотя я бы поставил my_list = ['item1', 'item2'] сразу после my_list = List(str), что, как я полагаю, и вызвало проблему. Спасибо за вашу помощь! PS, я заметил, что вы использовали UItem, а не Item. Оба работают, есть ли польза от использования UItem? - person RobMSN; 11.02.2013
comment
UItem является подклассом Item с show_label = False - вот и все. Взгляните на исходный код здесь: github.com/enthought/traitsui/ blob/master/traitsui/item.py - person Warren Weckesser; 11.02.2013
comment
Кроме того, я использовал метод _my_list_default для установки значения по умолчанию, но в данном случае это, вероятно, излишне. Вместо этого значение по умолчанию можно указать в объявлении типажа, используя value keyword: my_list = List(Str, value=['Item1', 'Item2'])` - person Warren Weckesser; 11.02.2013
comment
Спасибо, это полезно знать! - person RobMSN; 11.02.2013
comment
Знаете ли вы, есть ли способ заставить полосу прокрутки располагаться внизу, чтобы новые записи вызывали «прокрутку» дисплея, а не сбрасывали представление на первые N записей? - person davidA; 24.11.2013