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

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()

后续优化建议

  1. 英文翻译集成:可以使用Google Translate API、DeepL API等,把古吉拉特语的摘要内容翻译成英文
  2. 专业摘要算法:替换当前的高频词逻辑,用TextRank算法或者预训练的NLP模型(如BART、T5)生成连贯的摘要
  3. PDF文本提取优化:如果PyPDF2提取效果不好,可以换成pdfplumber库,它对复杂PDF的文本提取更准确

内容的提问来源于stack exchange,提问作者Mohammed Suhail Shaikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:15:07