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

Объект Listbox – это поле со списком строк. Программист может дополнить его: сделать меню «Функции» или привязать к нажатиям на клавиши определенные события.

Скачать пример ListBox.py

Пример использования объекта Listbox в примере FileBrowser.py. Приложение FileBrowser.py находится в установочном комплекте.

Создается и активируется объект так же, как и Text, при этом ему передаются два аргумента – список строк и имя функции:

>>> list = [u’Symbian’, u’Windows Mobile’, u’Linux’, u’Palm’]

>>> def callback():

… pass

>>> import  appuifw

>>> appuifw.app.body = body = appuifw.Listbox(list, callback)

>>>

 

Одноуровневый список Listbox.

Разберем код. Объект находится в модуле 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)

>>>

Двухуровневый список Listbox.

Методы объекта

bind(event_code, callback)

Привязывает запуск функции callback к нажатию на клавишу с кодом event_code (список кодов был дан в предыдущей статье).

current()

Возвращает номер активной строки (т.е. та, которая выделена на данный момент).

set_list(list [,current])

Устанавливает новый список list с уже активной строкой current (если отсутствует, то активна первая строка).

Пример использования объекта Listbox и его методов будет дан в программе ListBox.py ближе к концу статьи. Сейчас же подробно рассмотрю уже известный тип данных – список.

Создание и изменение списка

В первых статьях я рассказал, что списки используются для группировки значений (элементов), разделенных запятыми и заключенными в квадратные скобки:

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

Скачать пример 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)]

Меню программы ListBox.py.

 

В-третьих, приводим код (уже известный по программе 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 с выделением той строки, где расположен искомый элемент.

Скачать пример ListBox.py






Рекомендуемый контент




Copyright © 2010-2017 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.