Уведомления

Группа в Telegram: @pythonsu

#1 Март 8, 2016 11:29:44

Giffr
Зарегистрирован: 2016-02-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод списка файлов на текстовый дисплей

Нужно написать программу для Raspberry Pi, которая выводит на текстовый экран (16x2) список файлов определенного разрешения из определенной директории. Чтобы потом можно было с помощью подключенного блока кнопок прокручивать этот список и выбирать файлы. К примеру выбрать файл и потом отправить его печататься.
Написал тестовую программы, которая выводит массив в виде текста, разбивая его на строки (один файл – одна строка). Проблема в том, что программа выводит массив только из двух файлов, остальные отбрасывает, соответственно листать там больше нечего. И выводится это все в виде текста, а это значит никакие действия с выведенными файлами в списке совершать невозможно.
Как решить эту проблему?

Ниже прикрепил, то что дает программа на выходе.

Код программы:

#!/usr/bin/python  
  
import RPi.GPIO as GPIO
import os  
from time import sleep 
directory = '/media/TRANSCEND'
files = os.listdir(directory) 
images = filter(lambda x: x.endswith('.jpg'), files)  
class HD44780:  
  
    def __init__(self, pin_rs=7, pin_e=8, pins_db=[25, 24, 23, 18]):  
  
        self.pin_rs=pin_rs  
        self.pin_e=pin_e  
        self.pins_db=pins_db  
  
        GPIO.setmode(GPIO.BCM)  
        GPIO.setup(self.pin_e, GPIO.OUT)  
        GPIO.setup(self.pin_rs, GPIO.OUT)  
        for pin in self.pins_db:  
            GPIO.setup(pin, GPIO.OUT)  
  
        self.clear()  
  
    def clear(self):  
          
        self.cmd(0x33) # $33 8-bit mode  
        self.cmd(0x32) # $32 8-bit mode  
        self.cmd(0x28) # $28 8-bit mode  
        self.cmd(0x0C) # $0C 8-bit mode  
        self.cmd(0x06) # $06 8-bit mode  
        self.cmd(0x01) # $01 8-bit mode  
  
    def cmd(self, bits, char_mode=False):  
          
        sleep(0.001)  
        bits=bin(bits)[2:].zfill(8)  
  
        GPIO.output(self.pin_rs, char_mode)  
  
        for pin in self.pins_db:  
            GPIO.output(pin, False)  
  
        for i in range(4):  
            if bits[i] == "1":  
                GPIO.output(self.pins_db[::-1][i], True)  
  
        GPIO.output(self.pin_e, True)  
        GPIO.output(self.pin_e, False)  
  
        for pin in self.pins_db:  
            GPIO.output(pin, False)  
  
        for i in range(4,8):  
            if bits[i] == "1":  
                GPIO.output(self.pins_db[::-1][i-4], True)  
  
  
        GPIO.output(self.pin_e, True)  
        GPIO.output(self.pin_e, False)  
  
    def message(self, text):  
          
        for char in text:  
            if char == ',':  
                self.cmd(0xC0) # переход на следующую строку  
            else:  
                self.cmd(ord(char),True)  
  
if __name__ == '__main__':  
  
    lcd = HD44780()
	images = str(images)	
    lcd.message(images

Отредактировано Giffr (Март 8, 2016 11:33:13)

Прикреплённый файлы:
attachment IMG_20160308_120255.jpg (499,2 KБ)

Офлайн

#2 Март 8, 2016 12:21:47

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Вывод списка файлов на текстовый дисплей

все верно. выдает весь список

files = os.listdir("/home")
f_index = 0
f_len = len(files)
while True:
    s = raw_input()
    if s == 'q': break
    elif s == 'n':
        f_index += 1
        f_index %= f_len
    elif s == 'p':
        f_index -= 1
        f_index += f_len
        f_index %= f_len
    print f_index, files[f_index]

Отредактировано vic57 (Март 8, 2016 12:28:36)

Офлайн

#3 Март 8, 2016 12:55:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Вывод списка файлов на текстовый дисплей

Giffr
Как решить эту проблему?
Сначала напиши правильно исполнитель, который работает с этим табло. Он не должен понимать, какой текст ему подают. Он должен правильно выводить любой текст.

Вот этот метод неправильный.
Giffr
    def message(self, text):  
        
        for char in text:  
            if char == ',':  
                self.cmd(0xC0) # переход на следующую строку  
            else:  
                self.cmd(ord(char),True)
Во-первых, в тексте, выводимом на табло, может быть запятая. Поэтому он не должен заменять запятую, а должен выводить её. Во-вторых, если нужен перевод строки, то для этого нужно использовать стандартный \n. В-третьих, нужно следить за длиной сообщения, сдвигая его влево на табло, если она превышена. Для этого нужно хранить буфер внутри, который и будет выводиться.

Вот когда у тебя будет рабочий исполнитель, ты его оформишь в виде отдельного модуля и потом симпортируешь в основной модуль.
А в основном модуле у тебя должны доставаться пути, переводиться в текст и передаваться исполнителю для вывода на табло.

Фактически, табло не должно понимать, кем и какой текст ему передаётся, а тот, кто ищет пути, не должен знать, куда они дальше будут переданы.

Giffr
Чтобы потом можно было с помощью подключенного блока кнопок прокручивать этот список и выбирать файлы.
А блок кнопок тоже не должен знать про табло. У тебя должна быть программа, которая управляет тремя независимыми вещами: табло, поисковиком путей и блоком кнопок.
Это как в машине - когда ты крутишь руль, поворачиваются колёса. Но руль не знает про колёса, а колёса не знают про руль. Вот в программах всё то же самое.



Отредактировано py.user.next (Март 8, 2016 13:03:32)

Офлайн

#4 Март 8, 2016 20:21:50

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Вывод списка файлов на текстовый дисплей

и тут ошибка

images = str(images)
>>> lst = ['a','s','d','f']
>>> lst
['a', 's', 'd', 'f']
>>> str(lst)
"['a', 's', 'd', 'f']"
>>>

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version