Tkinter中点击Submit按钮触发NameError:name 'submit'未定义
解决NameError: name 'submit' is not defined错误及古吉拉特语PDF摘要项目优化
核心错误修复
你的代码报NameError: name 'submit' is not defined,原因很直接:Python代码是从上到下顺序执行的。你在创建submit_button的时候,submit函数还没被定义,Python自然找不到这个名称。
只需要把submit函数的定义移到创建按钮的代码之前,就能解决这个问题。
其他必须修复的问题
除了函数顺序问题,你的代码还有几个影响功能的bug:
- 直接读取PDF二进制文件并
decode("utf-8")是错误的,PDF不是纯文本格式,必须用专门的库提取文本 - 没有处理用户取消选择文件的情况
- 古吉拉特语分词和停用词需要确保NLTK资源已下载
- 原摘要逻辑只是取高频词,不是真正的摘要,且没有实现英文翻译和下载功能
完整修正代码
先安装依赖库:
pip install nltk PyPDF2
修正后的代码:
import tkinter as tk from tkinter import filedialog import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize import PyPDF2 # 首次运行下载NLTK必要资源(分词器、停用词) nltk.download('punkt') nltk.download('stopwords') # 先定义submit函数,再创建按钮 def submit(): # 让用户选择PDF文件 file_path = filedialog.askopenfilename(filetypes=[("PDF files", "*.pdf")]) # 处理用户取消选择的情况 if not file_path: output_label.config(text="未选择文件") return # 提取PDF中的文本 raw_text = "" with open(file_path, 'rb') as pdf_file: pdf_reader = PyPDF2.PdfReader(pdf_file) # 遍历所有页面提取文本 for page in pdf_reader.pages: page_text = page.extract_text() if page_text: raw_text += page_text if not raw_text: output_label.config(text="未能从PDF中提取有效文本") return # 古吉拉特语文本分词 tokens = word_tokenize(raw_text, language='gujarati') # 移除停用词和空白字符 guj_stopwords = set(stopwords.words("gujarati")) filtered_tokens = [token for token in tokens if token not in guj_stopwords and token.strip()] if not filtered_tokens: output_label.config(text="过滤后无有效词汇") return # 生成高频词(后续可替换为专业摘要算法+英文翻译) freq_dist = nltk.FreqDist(filtered_tokens) top_20_words = [word for word, _ in freq_dist.most_common(20)] # 这里可以集成翻译API转成英文,示例先保留古吉拉特语高频词,后续可扩展 summary_content = "英文摘要(待翻译优化):" + " ".join(top_20_words) output_label.config(text=summary_content) # 创建GUI界面 root = tk.Tk() root.title("古吉拉特语PDF摘要工具") # 可选:输入框用于设置摘要长度(示例保留) input_field = tk.Entry(root, width=50, placeholder="输入摘要关键词数量(默认20)") input_field.pack(pady=5) # 创建提交按钮(此时submit已定义,不会报错) submit_btn = tk.Button(root, text="选择PDF生成摘要", command=submit) submit_btn.pack(pady=5) # 显示摘要的标签 output_label = tk.Label(root, wraplength=450, justify="left", padx=10, pady=10) output_label.pack() # 实现下载功能 def download_summary(): summary_text = output_label.cget("text") if not summary_text or "未选择" in summary_text or "未能提取" in summary_text: return save_path = filedialog.asksaveasfilename( defaultextension=".txt", filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")] ) if save_path: with open(save_path, 'w', encoding='utf-8') as f: f.write(summary_text) download_btn = tk.Button(root, text="下载摘要", command=download_summary) download_btn.pack(pady=5) # 启动GUI主循环 root.mainloop()
后续优化建议
- 英文翻译集成:可以使用Google Translate API、DeepL API等,把古吉拉特语的摘要内容翻译成英文
- 专业摘要算法:替换当前的高频词逻辑,用TextRank算法或者预训练的NLP模型(如BART、T5)生成连贯的摘要
- PDF文本提取优化:如果PyPDF2提取效果不好,可以换成
pdfplumber库,它对复杂PDF的文本提取更准确
内容的提问来源于stack exchange,提问作者Mohammed Suhail Shaikh
相关产品推荐
相关产品推荐

