You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask应用中Python类报错:'SSD1306_I2C'对象不可调用求解决

Flask应用与OLED显示调试错误修复

问题场景

开发第一个Flask应用时,整合OLED显示功能出现运行错误,相关代码如下:

flask.py

from test_displayclass import Bartender

class MyFlask:
    bartender = Bartender()

    def __init__(self):
        #self.bartender = Bartender()
        self.bartender.test()

from flask import Flask
app = Flask(__name__)

my_flask = MyFlask()

@app.route("/Test")
def Test():
    return my_flask.test.APIfunction

if __name__ == "__main__":
    app.run(debug=True,port=9999)

test_displayclass.py

import adafruit_ssd1306
import busio
from board import SCL, SDA
from PIL import Image, ImageDraw, ImageFont

class Display():
    def __init__(self):
        i2c = busio.I2C(SCL, SDA)
        self.oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
        self.oled.fill(0)
        self.oled.show()

    def drawImage(self, image):
        self.oled(image)
        self.oled.show()


class Bartender():
     
    def __init__(self):
        self.oled = Display()


    def test(self):
        image = Image.new("1", (20, 20))
        
        draw = ImageDraw.Draw(image)
        font  = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 25)
        self.len = len("e")
        
        draw.text(
                (0, 40 - 2 // 2),
                "e",
                font=font,
                fill=255,
            )

错误信息

Traceback (most recent call last):
  File "/home/pi/Smart-Bartender/bartender_flask_new_test.py", line 13, in <module>
    my_flask = MyFlask()
  File "/home/pi/Smart-Bartender/bartender_flask_new_test.py", line 8, in __init__
    self.bartender.test()
  File "/home/pi/Smart-Bartender/test_displayclass.py", line 61, in test
    self.oled.drawImage(image)
  File "/home/pi/Smart-Bartender/test_displayclass.py", line 33, in drawImage
    self.oled(image)
TypeError: 'SSD1306_I2C' object is not callable

问题分析

  1. 核心错误:Display.drawImage方法中,错误地将self.oled(SSD1306_I2C实例)当作函数调用,正确操作是调用self.oled.image()方法传入图像对象。
  2. 次要问题:Bartender.test方法未调用drawImage渲染生成的图像;Flask路由中的my_flask.test.APIfunction完全错误,MyFlask实例无test属性,Bartender也无APIfunction方法。

修正后的代码

修正test_displayclass.py

import adafruit_ssd1306
import busio
from board import SCL, SDA
from PIL import Image, ImageDraw, ImageFont

class Display():
    def __init__(self):
        i2c = busio.I2C(SCL, SDA)
        self.oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
        self.oled.fill(0)
        self.oled.show()

    def drawImage(self, image):
        # 替换错误的函数调用为正确的image()方法
        self.oled.image(image)
        self.oled.show()


class Bartender():
     
    def __init__(self):
        self.oled = Display()

    def test(self):
        image = Image.new("1", (128, 64))  # 改为OLED屏幕实际分辨率128x64,避免尺寸不匹配
        draw = ImageDraw.Draw(image)
        font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 25)
        
        draw.text(
            (0, 10),  # 调整坐标避免文字超出屏幕
            "e",
            font=font,
            fill=255,
        )
        # 新增调用drawImage方法渲染图像
        self.oled.drawImage(image)
    
    # 新增API可用方法,返回测试响应
    def APIfunction(self):
        return "OLED display test completed"

修正flask.py

from test_displayclass import Bartender
from flask import Flask

class MyFlask:
    def __init__(self):
        self.bartender = Bartender()  # 改为实例属性,避免类属性初始化问题
        self.bartender.test()

app = Flask(__name__)
my_flask = MyFlask()

@app.route("/Test")
def Test():
    # 调用bartender实例的APIfunction方法
    return my_flask.bartender.APIfunction()

if __name__ == "__main__":
    app.run(debug=True, port=9999)

额外说明

  • 调整图像尺寸为OLED屏幕的128x64,确保图像正常显示
  • 将Bartender改为MyFlask的实例属性,避免多线程/请求场景下的潜在问题
  • 新增APIfunction方法,让Flask路由返回有效响应

内容的提问来源于stack exchange,提问作者test1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:42:02