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

使用Tkinter定义Python函数时遇NameError错误求助

嘿,我来帮你搞定这个问题!你遇到的NameError是Python里很常见的顺序问题——你在定义searchgo函数之前就尝试用它作为按钮的command参数了。Python是逐行执行代码的,当运行到创建temp按钮那一行时,searchgo函数还没被定义,所以它不知道这个名字指的是什么。

另外,你的代码还有个隐藏问题:你同时用了grid()和pack()两种布局管理器来放置控件,Tkinter不允许在同一个窗口里混用这两种,这也会导致程序崩溃,得一起修正。

下面是修复后的完整代码,我标清楚了关键修改点:

import requests
import re
from tkinter import *

root = Tk()
root.title('WordCounter')
root.configure(bg='#2f3136')
root.geometry('700x700')
root.resizable(False, False)

# 核心修改1:先定义函数,再创建引用它的按钮
def searchgo():
    word = e1.get()
    URL = e2.get()
    # 增加异常处理,避免无效URL/网络问题导致崩溃
    try:
        page = requests.get(URL).text
        # 把find改成count,结果更实用(如果需要首次索引可以换回find)
        occurrence_count = page.count(word)
        print(f"单词 '{word}' 在页面中出现了 {occurrence_count} 次")
    except Exception as e:
        print(f"运行出错:{str(e)}")

# 创建控件
e1 = Entry(root, width='35')
label1 = Label(root, text='Write The Word You Want To Search For', bg='#2f3136', fg='white')
e2 = Entry(root, width='35')
label2 = Label(root, text='Write the websites URL', bg='#2f3136', fg='white')
temp = Button(root, text='GO', command=searchgo)

# 核心修改2:统一用grid布局,禁止混用grid和pack
label1.grid(row=1, column=1, padx=10, pady=10)
e1.grid(row=2, column=1, padx=10, pady=5)
label2.grid(row=1, column=2, padx=10, pady=10)
e2.grid(row=2, column=2, padx=10, pady=5)
# 按钮跨两列居中放置
temp.grid(row=3, column=1, columnspan=2, pady=20)

root.mainloop()

关键说明:

  • 函数顺序调整:把searchgo移到按钮创建之前,确保Python处理按钮的command参数时,已经识别到这个函数。
  • 布局管理器统一:将按钮的pack()改为grid(),和其他控件保持一致,避免Tkinter的布局冲突报错。
  • 异常处理优化:给网络请求部分加上try-except,防止输入无效URL、网络断开等情况导致程序直接崩溃。
  • 功能优化(可选):把原来的page.find(word)改成统计出现次数的page.count(word),结果更符合单词搜索的实际需求,如果你需要首次出现的索引,可以换回原逻辑。

这样修改后,你的GUI程序就能正常运行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:37:39