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

从其他文件类导入组件到函数报错:NameError: name 'textbox1' is not defined

问题:跨文件调用Tkinter类组件时触发NameError

想在main.py的function1函数里调用page1.py中Page1(tk.Frame)类的textbox1和textbox2,运行时报错:

NameError: name 'textbox1' is not defined

原代码

main.py

import tkinter as tk
from tkinter import ttk
from tkinter import *

from page1 import Page1

root = tk.Tk()
root.geometry('480x320')

style = ttk.Style()
style.theme_use('default') 
style.configure('TNotebook', tabposition='wn', background='white', tabmargins=0)
style.configure('TNotebook.Tab', background='white', width=10, focuscolor='yellow', borderwidth=0)
style.map('TNotebook.Tab', background=[('selected', 'yellow')])

nb = ttk.Notebook(root)
nb.place(x=0, y=70)
page1 = Page1(nb, width=492, height=905)
nb.add(page1, text='Tab 1', compound='left')

def function1(textbox1, textbox2):

    val_1 = "example 1"
    textbox1.insert(0, val_1)

    val_2 = "example 1"
    textbox2.insert(0, val_2)

button1 = Button(root, text="Button", command= function1(textbox1, textbox2))
button1.place(x=0, y=0)

root.mainloop()

page1.py

import tkinter as tk
from tkinter import ttk
from tkinter import *
from tkinter import ttk
import tkinter as tk
import tkinter.font as tkFont
from tkinter import ttk

class Page1(tk.Frame):
    def __init__(self, master, **kw):
        super().__init__(master, **kw)

        self.textbox1 = ttk.Entry(self, width=7)
        self.textbox1.place(x=10, y=10)

        self.textbox2 = ttk.Entry(self, width=7)
        self.textbox2.place(x=10, y=40)

错误原因

  1. 变量作用域错误:textbox1和textbox2是Page1类的实例属性(定义时带self.前缀),只能通过Page1的实例(也就是你创建的page1对象)访问,全局作用域里根本不存在单独的textbox1变量。
  2. Command参数误用:command=function1(textbox1, textbox2)会在程序启动时直接执行function1,而不是等待按钮点击时执行——因为这里是直接调用函数,不是传递函数对象。

修复方案

  1. 修改function1,不再需要传参,直接通过已创建的page1实例访问其textbox1和textbox2属性。
  2. 调整按钮的command参数,使用lambda包装函数调用,确保点击按钮时才执行。
  3. 清理page1.py中重复的导入语句,避免冗余。

修改后的代码

main.py

import tkinter as tk
from tkinter import ttk
from tkinter import *

from page1 import Page1

root = tk.Tk()
root.geometry('480x320')

style = ttk.Style()
style.theme_use('default') 
style.configure('TNotebook', tabposition='wn', background='white', tabmargins=0)
style.configure('TNotebook.Tab', background='white', width=10, focuscolor='yellow', borderwidth=0)
style.map('TNotebook.Tab', background=[('selected', 'yellow')])

nb = ttk.Notebook(root)
nb.place(x=0, y=70)
page1 = Page1(nb, width=492, height=905)
nb.add(page1, text='Tab 1', compound='left')

def function1():
    val_1 = "example 1"
    page1.textbox1.insert(0, val_1)

    val_2 = "example 2"
    page1.textbox2.insert(0, val_2)

# 使用lambda确保点击按钮时才执行function1
button1 = Button(root, text="Button", command=lambda: function1())
button1.place(x=0, y=0)

root.mainloop()

page1.py

import tkinter as tk
from tkinter import ttk
import tkinter.font as tkFont

class Page1(tk.Frame):
    def __init__(self, master, **kw):
        super().__init__(master, **kw)

        self.textbox1 = ttk.Entry(self, width=7)
        self.textbox1.place(x=10, y=10)

        self.textbox2 = ttk.Entry(self, width=7)
        self.textbox2.place(x=10, y=40)

补充说明

如果需要让function1更通用(比如支持操作不同Page实例的输入框),也可以改成带参数的形式,通过lambda传递实例属性:

def function1(textbox1, textbox2):
    val_1 = "example 1"
    textbox1.insert(0, val_1)

    val_2 = "example 2"
    textbox2.insert(0, val_2)

button1 = Button(root, text="Button", command=lambda: function1(page1.textbox1, page1.textbox2))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:55:56