Я делаю меню, которое работает на ЖК-экране, питаемом от Raspberry Pi. Я пытаюсь использовать модуль потоковой передачи, чтобы текст на ЖК-дисплее обновлялся до тех пор, пока положение меню не изменится.Цитирование функции до тех пор, пока не будет вызвана другая функция
Меню составлено из списка функций, вызываемых при изменении положения меню. Функция switch_menu()
вызывается извне класса, используя обработчик событий и используется для вызова правильной функции меню. С некоторыми из этих функций (item2
); Я хочу, чтобы они зацикливались, а с другими (item1
); просто покажите статический текст. Важно то, что они прекращают цикл, когда switch_menu()
вызывается снова. Как я могу это сделать?
(здесь это упрощенная версия моего кода)
class Menu:
def __init__(self):
self.LCD = Adafruit_CharLCD()
self.m_pos = 0
self.items = [self.item1,self.item2]
self.switch_menu(0)
def switch_menu(self,operation):
# 2. And here I want to stop it.
m_pos = self.m_pos
pos = m_pos
max_pos = len(self.items) - 1
m_pos = self.loop_selection(pos,max_pos,operation)
# 1. Here I want to start looping the function below.
self.items[m_pos]()
self.m_pos = m_pos
def loop_selection(self,pos,max_pos,operation):
if pos >= max_pos and operation == 1:
pos = 0
elif pos <= 0 and operation == -1:
pos = max_pos
else:
pos += operation
return pos
def item1(self):
self.LCD.clear()
text = "item1"
self.LCD.message(text)
def item2(self):
while True:
self.LCD.clear()
text = "item2"
self.LCD.message(text)
time.sleep(10)
Благодарим вас за быстрый ответ. Я подумал об этом, однако, если функция спала, когда меню было изменено; программа будет казаться невосприимчивой. Я также не знаю, где поставить многопоточный код и как я должен его использовать. –
Непосредственно относительно вашего вопроса, одна маленькая вещь, которую вы могли бы рассмотреть, находится в _loop_selection_, чтобы попытаться использовать 'pos = (pos + 1)% (max_pos + 1)'. –
Что касается проблемы многопоточности, запускается новый поток на событие, которое вызовет _switch_menu_? –