Вот краткая версия моей проблемы и то, что я хочу:
- Чтение текста из файла
- Форматирование текста для отображения на ЖК-дисплее 4x20 с возможностью чтения переводы строки, если строка слишком длинная (например, посмотрите, какая длина строки (не более 20 символов), сделайте символ новой строки после последнего найденного пробела)
- Если текст в целом слишком длинный (более 80 символов) ) отобразить первые 80 символов на дисплее - очистить дисплей - показать оставшиеся символы - повторить несколько раз.
А вот и длинная версия;)
I ' новичок в программировании , и в настоящее время я работаю над небольшим домашним проектом, в котором я хочу использовать Raspberry Pi 3 вместе с GSM HAT (от Waveshare) для отображения полученного SMS на L * 1032. * -Отображение. После получения SMS (используя «Gammu-SMS Daemon») SMS сохраняется в виде файла .txt в папке на моем RPi. Оттуда я хочу прочитать его с помощью скрипта python и отобразить его в отформатированном виде на ЖК-дисплее. Пока ничего сложного я не подумала. Сейчас я борюсь (уже более недели), чтобы напечатать длинный текст SMS на моем дисплее. При использовании библиотеки RPLCD и связи через I2 C с моим дисплеем мой код до сих пор выглядит следующим образом:
# Description: Read text from received SMS Textfile and print it on an
# 4x20 LCD Screen
from __future__ import print_function
import os
import glob
import sys
import time
from time import *
import textwrap
from RPLCD.i2c import CharLCD
# setting up the parameters for the lcd. For standard use only the first two arguments are
# needed
lcd = CharLCD(i2c_expander="PCF8574", address=0x27,port=1,cols=20,rows=4,
dotsize=8,charmap="A02",auto_linebreaks=True,backlight_enabled=True)
# open last received SMS file:
list_of_files = glob.glob('/home/pi/sms_inbox/*.txt')
latest_file = max(list_of_files, key=os.path.getctime)
with open(latest_file, "r") as file:
data = file.read()
# print to LCD. If data is too long, text starts to
# print from top to bottom again over existing characters
lcd.write_string(data)
file.close()
Это работает до тех пор, пока текст из файла не длиннее 4x20 = 80 символов в длину очевидно. Если текст длиннее этого, новые символы размещаются над первыми символами в первой строке дисплея. Не подлежит, конечно. Затем я использовал textwrap
lib для форматирования в макс. из 20 символов в строке. Я добавил это, и мой вывод на терминал через функцию print
выглядел очень многообещающим. Затем я подумал, что могу сохранить этот новый форматированный текст в новом файле и снова прочитать его, чтобы получить идеальную ширину текста. Но мой LCD не думал об этом. Может быть, потому что в файле происходит много странных, невидимых символов? Вот расширенный код:
# Description: Read text from received SMS Textfile and print it on an
# 4x20 LCD Screen
from __future__ import print_function
import os
import glob
import sys
import time
from time import *
import textwrap
from RPLCD.i2c import CharLCD
# setting up the parameters for the lcd. For standard use only the first two arguments are
# needed
lcd = CharLCD(i2c_expander="PCF8574", address=0x27,port=1,cols=20,rows=4,
dotsize=8,charmap="A02",auto_linebreaks=True,backlight_enabled=True)
# open last received SMS file:
list_of_files = glob.glob('/home/pi/sms_inbox/*.txt')
latest_file = max(list_of_files, key=os.path.getctime)
with open(latest_file, "r") as file:
data = file.read()
# print to LCD. If data is too long, text starts to
# print from top to bottom again over existing characters
lcd.write_string(data)
# open a new file here. Save new formated text in there
processed_file = open("/home/pi/processed_sms/processed_sms.txt","w")
# shorten each line of text to a max. of 20 characters.
# This does NOT cut a word in the middle, it makes a newline
# on a found whitespace character found before the word which is too long:
wrapper = textwrap.TextWrapper(width=20)
wordlist = wrapper.wrap(text = data)
for element in wordlist:
print(element)
# save new formatted file
processed_file.write(element)
processed_file.write("\n")
file.close()
processed_file.close()
# open formated file again and try to display it on the LCD (doesent work properly!)
processed_file_read = open("/home/pi/processed_sms/processed_sms.txt","r")
new_data = processed_file_read.read()
# display show weird formating, it's not readable!
lcd.write_string(new_data)
processed_file_read.close()
Новый файл не был читаем для моего ЖК-дисплея, текст был полностью отключен в отношении строк, пробелов и всего остального. Невозможно прочитать! Я также попробовал некоторые самодельные алгоритмы для форматирования текста, но мне не так просто, как начинающему в программировании , особенно в python. Таким образом, вся хитрость заключается в том, чтобы отформатировать и разместить текст, как я уже говорил несколько раз, таким образом, чтобы он мог уместиться на дисплее. Если текст слишком длинный, он должен отображать первые 80 символов, очистить дисплей и показать оставшиеся. Тогда я хотел бы повторить это пару раз. Это не может быть так сложно, или что вы думаете?
Можете ли вы помочь мне? Это было бы так здорово! Я хочу go спать рано на следующий день: D. ТАНКИ уже!