категории | RSS

Автор: Газетдинов Альберт

Python на Symbian S60: списки и объект Listbox пример ListBox.py

Объект Listbox - это поле со списком строк. Программист может дополнить его: сделать меню «Функции» или привязать к нажатиям на клавиши определенные события.
Создается и активируется объект так же, как и Text, при этом ему передаются два аргумента - список строк и имя функции:
>>> list = [u'Symbian', u'Windows Mobile', u'Linux', u'Palm']
>>> def callback():
... pass
...
>>> import appuifw
>>> appuifw.app.body = body = appuifw.Listbox(list, callback)
>>>
Разберем код. Объект находится в модуле appuifw, который подключается с помощью команды import. Listbox присваивается атрибуту app.body («тело» программы). Список list содержит строки Unicode, которые и выводятся на экран. callback будет вызываться каждый раз при нажатии на джойстик.
Для создания двухуровневого списка необходимо указать список кортежей, каждый из которых состоит из 2-х строк Unicode: первый отвечает за верхний (крупным шрифтом) уровень, второй - за нижний (мелким шрифтом). Общий вид: [(item1, item1_description), (item2, item2_description),..., (itemN, itemN_description)]:
>>> list = [
(u'Symbian', u'Siemens SX1, Nokia N70'),
(u'Windows Mobile', u'E-Ten G500, HPiPAQrx1950')]
>>> def callback():
... pass
...
>>> import appuifw
>>> appuifw.app.body = body = appuifw.Listbox(list, callback)
>>>
Методы объекта
bind(event_code, callback)
Привязывает запуск функции callback к нажатию на клавишу с кодом event_code
current()
Возвращает номер активной строки (т.е. та, которая выделена на данный момент).
set_list(list [,current])
Устанавливает новый список list с уже активной строкой current (если отсутствует, то активна первая строка).
Сейчас же подробно рассмотрю уже известный тип данных - список.
Создание и изменение списка
В первых статьях я рассказал, что списки используются для группировки значений (элементов), разделенных запятыми и заключенными в квадратные скобки:
>>> list = [1, 2, 3]
>>>
Элементы списка могут быть разного типа:
>>> list = [1, 'Two', 3.0, ['One', 2.0, 3]]
>>>
Списки можно складывать как числа (т.е. объединять их):
>>> [1, 'Two', 3.0] ['One', 2.0, 3]
[1, 'One', 'Two', 2.0, 3.0, 3]
>>>
Обращение к элементам списка производится по индексам элементов. При этом нумерация списков идет с нуля:
>>> list = [1, 'Two', 3.0]
>>> list[0]
1
>>>
Если индекс меньше нуля, то происходит отсчет с конца списка:
>>> list = [1, 'Two', 3.0]
>>> list[-2]
'Two'
>>>
Можно получить срез списка различными способами:
>>> list = [1, 'Two', 3.0, 4]
>>> list[0:2]
['Two', 3.0]
>>> list[:2]
['Two', 3.0]
>>> list[-2:]
[4, 5]
>>> list[1:3]
['Two', 3.0]
>>> list[-3:-1]
[3.0, 4]
>>> list[:2] list[3:]
[1, 'Two', 4, 5]
>>>
В отличие от строк, элементы списка можно изменять:
>>> list = [1, 'Two', 3.0]
>>> list[1]=2
>>> list[2]=3
>>> list
[1, 2, 3]
>>>
Причем использовать в качестве нового элемента другой список:
>>> list = [1, 'Two', 3.0]
>>> list[1:2] = [2,3]
>>> list
[1, 2, 3]
>>> list = [1, 2, 3, 4, 5]
>>> list [1:3] = []
>>> list
[1, 5]
>>>
Встроенная функция len() определяет длину списка, а оператор del удаляет элемент по индексу или срезу (если он указан):
>>> list = [1, 2, 3, 4, 5]
>>> len(list)
5
>>> del list[2]
>>> list
[1, 2, 4, 5]
>>> del [1:3]
>>> list
[1, 5]
>>> len(list)
2
>>>
Методы списков
append(x)
Добавляет элемент x в конец списка:
>>> list = [1, 2.0]
>>> list.append('Three')
>>> list
[1, 2.0. 'Three']
>>>
extend(t)
Добавляет элементы последовательности t в конец списка (т.е. объединяет их):
>>> list1 = [1, 2, 3]
>>> list2 = [4, 5, 6]
>>> list1.extend(list2)
>>> list1
[1, 2, 3, 4, 5, 6]
>>>
count(x)
Возвращает количество элементов в списке со значением x (т.е. перебирает весь список и определяет, сколько раз встречается элемент x):
>>> list = [1, 3, 3, 4]
>>> list.count(3)
2
>>> list.count(4)
1
>>>
index(x)
Возвращает наименьший индекс элемента x в списке, если такого элемента нет в списке, произойдёт ошибка):
>>> list = [1, 2, 4, 3]
>>> list.index(4)
2
>>> list[2]
4
>>>
insert(i, x)
Вставляет в список элемент x перед i-ым элементом, если i меньше нуля, то x вставляется в начало, если i больше длины списка - в конец):
>>> list = [1, 3]
>>> list.insert(1, 2)
>>> list
[1, 2, 3]
>>> list.insert(9, 4)
>>> list
[1, 2, 3, 4]
>>> list.insert(-5, 0)
>>> list
[0, 1, 2, 3, 4]
>>>
pop(i)
Возвращает i-ый элемент c одновременным удалением, если i не указан, то подразумевается последний элемент:
>>> list = [1, 2, 3, 4]
>>> list.pop(0)
1
>>> list
[2, 3, 4]
>>> list.pop()
4
>>> list
[2, 3]
>>>
remove(x)
Удаляет из списка первый элемент со значением x, если такого значения нет, то произойдет ошибка:
>>> list = [1, 2, 3, 3, 4]
>>> list.remove(3)
>>> list
[1, 2, 3, 4]
>>>
sort()
Сортирует список (от 1 до 9, от «a» до «z» и т.д.):
>>> list = [2, 1, 3, 'g', 'a']
>>> list.sort()
>>> list
[1, 2, 3, 'a','g']
>>>
reverse()
Сортирует список в обратном порядке:
>>> list = [1, 2, 3]
>>> list.reverse()
>>> list
[3, 2, 1]
>>>
Кроме обычных способов, Python предоставляет дополнительные возможности при конструировании списков:
>>> [index for index in range(9) if index>5]
[6, 7, 8]
>>>
Расшифрую:
1) в центре находится цикл for, который перебирает последовательность (список, кортеж, строка), идущую после оператора in;
2) слева находятся выражения, обрабатывающие элементы последовательности;
3) справа находятся условные выражения, которые фильтруют элементы, не удовлетворяющие условию (необязательная часть).
Это очень удобно, когда нужно быстро создать или отсортировать список по условию. Использование обычного цикла привело бы к написанию такого кода:
>>> list = []
>>> for index in range(9):
... if index > 5:
... list.append(index)
...
>>> list
[6, 7, 8]
>>>
Работа с кортежами
Кортежи создаются с помощью обычного перечисления элементов через запятую, при этом элементы могут быть различных типов данных. У кортежей можно получать значения элементов по индексу, доступно использование срезов и отрицательных индексов. Но кортеж изменить нельзя, к тому же у них нет ни одного метода:
>>> tuple = (1, 2.0, 'Three')
>>> tuple[2]
'Three'
>>> tuple[:-1]
(1, 2.0)
>>> len(tuple)
3
>>>
Кортеж, состоящий из одного элемента, создается так:
>>> tuple = (1,)
>>> tuple
(1,)
>>>.
Чтобы закрепить теорию работы со списками, я написал обучающую программу. Как и в прошлый раз, объясню структуру программы и работу некоторых функций прямо в статье (для большой ясности). Программа называется ListBox.py и предназначена для интерактивной работы со списками, используются возможности объекта Listbox.
ListBox.py
Функционал программы строится на основе методов списка:
1) добавить элемент;
2) сортировать список;
3) просмотреть последний элемент и удалить его;
4) удалить элемент по имени;
5) удалить выделенный элемент из списка;
6) найти элемент по имени.
В начале программы создаем список, который будет подопытным кроликом. Затем идет описание всех функции. В конце представлено несколько блоков кода.
Во-первых, создаем объект Listbox, который присваиваем переменной listbox (использовать эту переменную в функциях удобнее, чем громоздкую конструкцию appuifw.app.body). При создании передаем объекту два аргумента: начальный список (показывает количество элементов в списке) и имя функции info (вызывает при каждом нажатии на джойстик). Также привязываем с помощью метода bind вызов функции delete на клавишу «С»:
appuifw.app.body = listbox = appuifw.Listbox([u'Элементов: 0'],info)
listbox.bind(key_codes.EKeyBackspace, delete)
Во-вторых, описываем меню «Функции»:
appuifw.app.menu = [
(u'Добивать', append),
(u'Сортировать', sort),
(u'Вернуть', pop),
(u'Удалить', remove),
(u'Найти, index),
(u'Выход', exit)]
В-третьих, приводим код (уже известный по программе TextBox.py) для проверки того, откуда запущена программа: из консоли или как самостоятельное приложение.
Теперь опишем функции программы. Обратите внимание на команду global, которая даёт возможность использовать глобальную переменную list внутри тела функции.
def info():
global list
index=listbox.current()
if index>0:
appuifw.note(list[index-1])
Функция вызывается при нажатии на джойстик и выводит имя того элемента, который выделен:
1) получаем номер выделенной строки;
2) если номер больше нуля (нулевой элемент - это надпись с количеством элементов), то инициируем всплывающее окошко с его именем в списке.
def create():
global list
index=listbox.current()
number=[u'Элементов: ' unicode(len(list))]
listbox.set_list(number list, index)
Общая функция, которая вызывается для обновления объекта Listbox:
1) сохраняем номер выделенной строки;
2) создаем переменную, содержащую строку с количеством элементов в списке;
3) обновляем объект Listbox, передав ему новый список и старое расположение курсора (если это не сделать, то курсор автоматически переместится на начало).
def delete():
global list
index=listbox.current()
if index>0:
del list[index-1]
create()
Функция удаляет выделенный элемент списка:
1) получаем номер выделенного элемента;
2) если он больше нуля, то удаляем элемент из списка;
3) обновляем объект Listbox.
def append():
global list
text=appuifw.query(u'Введите имя элемента:', 'text', u'Безымянный')
if len(text)>=0:
list.append(text)
create()
Функция добавляет в конец списка новый элемент:
1) получаем от пользователя имя нового элемента (по умолчанию «Безымянный»);
2) если имя введено, то добавляем в конец списка новый элемент;
3) обновляем объект Listbox.
def pop():
global list
element=list.pop()
appuifw.note(u'Элемент ' element u' удален.')
create()
Функция:
1) получает последний элемент из списка;
2) инициирует всплывающее окошко с этим элементом;
3) обновляет объект Listbox.
def remove():
global list
text=appuifw.query(u'Введите имя удаляемого элемента:', 'text', u'Безымянный')
if len(text)>=0:
try:
list.remove(text)
except:
appuifw.note(u'Элемента с таким именем нет.','error')
else:
create()
Функция удаляет элемент по его имени:
1) получаем от пользователя имя элемента (по умолчанию «Безымянный»);
2) если имя введено, то удаляем его из списка;
3) если такого имени в списке нет, то сообщаем пользователю об этом;
4) иначе обновляем объект Listbox.
def sort():
global list
list.sort()
create()
Функция сортирует список и обновляет объект Listbox.
def index():
global list
text=appuifw.query(u'Введите имя элемента:', 'text', u'Безымянный')
if len(text)>=0:
try:
index=list.index(text)
except:
appuifw.note(u'Такого элемента нет.','error')
else:
number=[u'Элементов: ' unicode(len(list))]
listbox.set_list(number list, index 1)
Функция для поиска элемента по его имени:
1) получаем от пользователя имя элемента;
2) если имя было введено, то определяем имя элемента в списке;
3) в случае неудачи информируем пользователя об ошибке;
4) иначе обновляем объект Listbox с выделением той строки, где расположен искомый элемент.

DimonVideo
2008-04-04T18:44:55Z
Здесь находятся
всего 0. За сутки здесь было 0 человек

Комментарии 2

#2   merecoollover    

Выложите все о Питоне одним файлом!
Реально не удобно читать по частям.


0 ответить

#2   liosha2007    

Спасибо.smile хорошая статья...пригодится..


0 ответить

Яндекс.Метрика