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

Tkinter绑定readFImage回调报缺少必填位置参数'imgc'错误

报错根因

Tkinter的按钮command回调触发时,仅会默认传入事件对象,不会自动给你自定义函数的必填形参imgc传值。你定义的readFImage要求必须传入图片路径参数,直接绑定到按钮点击事件上调用时缺少这个必填参数,就会抛出当前的类型错误。

修复方案
  • 给「READ FROM IMAGE」按钮单独写无参数的触发逻辑:点击时先从路径输入框读取用户通过浏览按钮选中的图片路径,再把路径作为imgc参数传入readFImage执行识别
  • 同步修复代码里其他会导致运行异常的问题:
    • 补全识别结果写入界面结果文本框的逻辑,原来的代码仅在控制台打印识别内容,不会同步到UI
    • 修复「Read Aloud」按钮同样存在的参数缺失问题,点击时从结果框读取识别到的文本再调用朗读逻辑
    • 清理原函数里重复定义变量、冗余打印的无效代码
    • 修正文件选择器后缀匹配规则、OCR坐标类型不匹配、桌面环境无法用IPython组件播放音频等隐性运行错误
修复后完整代码
from tkinter import *
from tkinter import ttk
from tkinter.filedialog import askopenfilename
from PIL import Image
import easyocr
from gtts import gTTS
import cv2
import pygame

root = Tk()

def OpenFile():
    name = askopenfilename(initialdir="/",
                           filetypes =(("PNG File", "*.png"),("BMP File", "*.bmp"),("JPEG File", "*.jpeg"),("JPG File", "*.jpg")),
                           title = "Choose a file."
                           ) 
    PathTextBox.delete("1.0",END)
    PathTextBox.insert(END,name)


def readFImage(imgc):
    # 初始化OCR阅读器
    reader = easyocr.Reader(['en', 'hi'])
    result = reader.readtext(imgc, paragraph=True)
    img = cv2.imread(imgc)
    all_text = []
    # 绘制识别框、收集识别文本
    for detection in result: 
        top_left = tuple(map(int, detection[0][0]))
        bottom_right = tuple(map(int, detection[0][2]))
        text = detection[1]
        all_text.append(text)
        img = cv2.rectangle(img,top_left,bottom_right,(0,255,0),3)
    # 需要查看标注后的识别结果可以放开下面两行注释
    # cv2.imshow("OCR Result", img)
    # cv2.waitKey(0)
    # 把识别结果写入界面文本框
    full_text = "\n".join(all_text)
    ResultTextBox.delete("1.0", END)
    ResultTextBox.insert(END, full_text)
    return full_text

# 按钮触发的识别入口,无参数适配Tkinter回调规则
def trigger_read():
    img_path = PathTextBox.get("1.0", END).strip()
    if not img_path:
        ResultTextBox.delete("1.0", END)
        ResultTextBox.insert(END, "请先选择要识别的图片文件")
        return
    readFImage(img_path)

def readAloud():
    text = ResultTextBox.get("1.0", END).strip()
    if not text:
        return
    tts = gTTS(text)
    tts.save('1.wav')
    # 适配桌面程序播放音频,替换原代码仅能在Notebook环境生效的IPython组件
    pygame.mixer.init()
    pygame.mixer.music.load('1.wav')
    pygame.mixer.music.play()


Title = root.title( "Image Reader!")
path = StringVar()

InputLabel = Label(root,text = "INPUT IMAGE:")
InputLabel.grid(row=2,column = 1)

BrowseButton = Button(root,text="Browse", command = OpenFile)
BrowseButton.grid(row=2,column=2)

PathLabel = Label(root,text = "Path:")
PathLabel.grid(row = 3,column=1,sticky=(W))

PathTextBox = Text(root,height = 2)
PathTextBox.grid(row = 4,column = 1,columnspan=2)

# 绑定适配后的无参数触发函数
ReadButton = Button(root,text="READ FROM IMAGE", command = trigger_read)
ReadButton.grid(row = 5,column = 2)

DataLabel = Label(root,text = "DATA IN IMAGE:")
DataLabel.grid(row = 6,column=1,sticky=(W))

ResultTextBox = Text(root,height = 6)
ResultTextBox.grid(row = 7,column = 1,columnspan=2)

SoundButton = Button(root, text ='Read Aloud', command = readAloud).grid(row = 8, column = 2)

root.mainloop()

运行前如果需要使用朗读功能,先执行pip install pygame安装音频播放依赖即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:33:13