从其他文件类导入组件到函数报错: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)
错误原因
- 变量作用域错误:
textbox1和textbox2是Page1类的实例属性(定义时带self.前缀),只能通过Page1的实例(也就是你创建的page1对象)访问,全局作用域里根本不存在单独的textbox1变量。 - Command参数误用:
command=function1(textbox1, textbox2)会在程序启动时直接执行function1,而不是等待按钮点击时执行——因为这里是直接调用函数,不是传递函数对象。
修复方案
- 修改
function1,不再需要传参,直接通过已创建的page1实例访问其textbox1和textbox2属性。 - 调整按钮的
command参数,使用lambda包装函数调用,确保点击按钮时才执行。 - 清理
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
相关产品推荐
相关产品推荐

