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
问题分析
- 核心错误:
Display.drawImage方法中,错误地将self.oled(SSD1306_I2C实例)当作函数调用,正确操作是调用self.oled.image()方法传入图像对象。 - 次要问题:
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
相关产品推荐
相关产品推荐

