首页 > 解决方案 > 在 python 类中使用队列 - ''function' 对象不可下标

问题描述

我已经创建了一个用于在 16x2 LVC/VFD 上创建和渲染菜单的库,并添加了一些用于在显示器上滚动消息的功能。这很好用,但我遇到的问题是,如果您在发生这种情况时尝试显示另一条消息,则显示将损坏。我能想出的最佳解决方案是使用队列,因此每个消息函数都排在下一个消息函数后面。但是,我在线程中遇到了问题。

这是我的工人阶级的开始:

class RpiLCDMenu(BaseMenu):
def __init__(self, pin_rs=26, pin_e=19, pins_db=[13, 6, 5, 21], GPIO=None, scrolling_menu=False):
    """
    Initialize menu
    """
    self.lcd_queue = queue.LifoQueue(maxsize=0)
    self.scrolling_menu = scrolling_menu

    self.pin_rs = pin_rs
    self.pin_e = pin_e
    self.pins_db = pins_db
    self.GPIO = GPIO

    self.lcd = RpiLCDHwd(self.pin_rs, self.pin_e, self.pins_db, self.GPIO)
    self.lcd.initDisplay()
    # clear it once in case of corruption
    self.clearDisplay()
    self.message("Hello")


    super(self.__class__, self).__init__()

但是,如果我改用队列并尝试使用它,液晶屏仍然会被初始化,但消息失败并显示:

'function' 对象不可下标

不工作:

class RpiLCDMenu(BaseMenu):
def __init__(self, pin_rs=26, pin_e=19, pins_db=[13, 6, 5, 21], GPIO=None, scrolling_menu=False):
    """
    Initialize menu
    """
    self.lcd_queue = queue.LifoQueue(maxsize=0)
    self.scrolling_menu = scrolling_menu

    self.pin_rs = pin_rs
    self.pin_e = pin_e
    self.pins_db = pins_db
    self.GPIO = GPIO


    # todo implement message queue to avoid corruption
    self.lcd_queue_processor()

    super(self.__class__, self).__init__()

def lcd_queue_processor(self):
    print("queue started")
    self.lcd = RpiLCDHwd(self.pin_rs, self.pin_e, self.pins_db, self.GPIO)
    self.lcd.initDisplay()
    # clear it once in case of corruption
    self.clearDisplay()
    self.message("Hello")

    while True:
        print("running")
        items = self.lcd_queue.get()
        func = items[0]
        args = items[1:]
        func(*args)

我不确定为什么消息功能在这种情况下停止工作。

我绝不是开发人员,所以任何帮助表示赞赏!完整的图书馆...

https://github.com/domb84/rpi-lcd-menu

标签: pythonqueue

解决方案


看起来您正在将一个函数推入队列。问题在

items = self.lcd_queue.get()
func = items[0]
args = items[1:]

get()仅返回您无法索引的单个项目(在您的情况下为函数)。

文档


推荐阅读