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
相关产品推荐
相关产品推荐

