Многие используют второй листбокс чтобы сделать меню с иконками либо список с
возможностью выделения элементов, я же уже не могу построить достаточно сложный
интерфейс на обычном Listbox.
Прежде чем разбираться с особенностями Listbox рекомендую ознакомиться как в
принципе им пользоваться в appuifw2 API.
Нас интересует то что все элементы листбокса2 являются объектами appuifw2.Item,
то есть экземплярами класса appuifw2.Item. Этот класс имеет некоторые
обязательные (и не очень) атрибуты:
* title - название пункта, или первая строка элемента в листбоксе
* subtitle - вторая строка элемента в листбоксе
* многие другие icon, marked и др...
Так вот удобной особенностью Listbox2 является то что при создании appuifw2.Item
можно делать свои атрибуты в appuifw2.Item, которые будут храниться прямо в
Listbox2, но отображаться не будут, то есть например
- aw.Item(title=u'Лайт Портал', url='http://ligh.te.ua')
Мы добавили атрибут url значение которого равно строке http://www.dimonvideo.ru,
если же добавить такой элемент в листбокс то мы увидим однострочный пункт с
надписью DimonVideo. Но при необходимости мы легко сможем достать атрибут url
например следующим образом
- i=appuifw2.app.body.current_item() # ВАЖНО! Этот метод возвращает выделенный
- объект appuifw2.Item, а не номер выбранного элемента
- dv_url=i.url #dv_url примет значение http://ligh.te.ua
Теперь проиллюстрирую где это можно применить на практике.
Задача:
Сделать список приложений чтобы по выбору оно запускалось (не важно через laa
или e32.start_exe). Я буду делать через e32.start_exe, так больше новичков
поймет.
Если реализовывать эту задачу с помощью обычного Listbox, то помимо самого
листбокса понадобится еще один список с путями к .exe файлам (причем описанный в
глобальном пространстве, так как наполнение происходит в одной фунции, а
использование в другой).
При реализации же с помощью Listbox2 необходимость использования дополнительной
переменной исчезает, так как пути к exe файлам можно записать прямо в Listbox2.
Здесь продемонстрирую только создание листбокса, полный исходник можно найти
здесь.
- import appuifw2 as aw, e32, applist
- ........
- aw.app.body=aw.Listbox2(items=[], select_callback=select)
- items=[]
- list=applist.applist() # список приложений вида [(уид, имя, путь), ...]
- for app in list:
- name=app[1]
- path=app[2]
- lb_item=aw.Item(title=name, path_to_exe=path) # создаем элемент листбокса,
- обратите внимание что мы создаем собственный атрибут path_to_exe, в котором
- хранится путь к exe файлу
- items.append(lb_item)
- aw.app.body.extend(items) # добавляем в сам листбокс список объектов aw.Item
Теперь рассмотрим функцию select которая будет обрабатывать выбор элемента.
- def select():
- i=aw.app.body.current_item()# получаем объект aw.Item соответствующий
- выбранному элементу
- exe=i.path_to_exe # из атрибута path_to_exe достаем путь к exe файлу
- e32.start_exe(exe, '')
И в конце еще хочу показать как можно короче сделать добавление элементов с
помощью спискового включения
- aw.app.body.extend([aw.Item(title=x[1], path_to_exe=x[2]) for x in
- applist.applist()])