Решил написать статью о интересных особенностях appuifw2.Listbox2 в Python.
Многие используют второй листбокс чтобы сделать меню с иконками либо список с возможностью выделения элементов, я же уже не могу построить достаточно сложный интерфейс на обычном Listbox.
Прежде чем разбираться с особенностями Listbox рекомендую ознакомиться как в принципе им пользоваться в appuifw2 API [Оригинал | Перевод].
Нас интересует то что все элементы листбокса2 являются объектами appuifw2.Item, то есть экземплярами класса appuifw2.Item. Этот класс имеет некоторые обязательные (и не очень) атрибуты:
* title - название пункта, или первая строка элемента в листбоксе
* subtitle - вторая строка элемента в листбоксе
* многие другие icon, marked и др...
Так вот удобной особенностью Listbox2 является то что при создании appuifw2.Item можно делать свои атрибуты в appuifw2.Item, которые будут храниться прямо в Listbox2, но отображаться не будут, то есть например
aw.Item(title=u'DimonVideo', url='http://www.dimonvideo.ru')
Мы добавили атрибут url значение которого равно строке https://www.dimonvideo.ru, если же добавить такой элемент в листбокс то мы увидим однострочный пункт с надписью DimonVideo. Но при необходимости мы легко сможем достать атрибут url например следующим образом
i=appuifw2.app.body.current_item() # ВАЖНО! Этот метод возвращает выделенный объект appuifw2.Item, а не номер выбранного элемента
dv_url=i.url #dv_url примет значение http://www.dimonvideo.ru
Теперь проиллюстрирую где это можно применить на практике.
Задача:
Сделать список приложений чтобы по выбору оно запускалось (не важно через 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()])
Источник новости: dimonvideo.ru
Просто и гениально)))
+
0 ответить