如何从Tkinter新窗口的Entry组件中获取值?
问题分析与解决方案
你的代码存在几个关键问题,导致get()调用失败和"Unresolved reference"错误,以下是逐一修正方案:
核心问题点
- 重复创建Tk实例:Tkinter仅允许一个主
Tk()实例,新窗口必须用Toplevel()创建,否则会引发组件状态异常。 - 无效逻辑判断:
if send:这行代码把函数名当作布尔值使用,逻辑完全错误,会导致后续代码执行异常。 - 变量作用域问题:如果
nw_entry是在某个局部函数内创建的(你简化代码可能没体现),send()函数无法直接访问这个局部变量。
修正后的代码(全局变量方案)
适合你当前进阶初学者的理解程度:
import tkinter as tk from email.message import EmailMessage my_email = "你的邮箱@example.com" def open_email_window(): # 声明nw_entry为全局变量,让send函数能访问 global nw_entry # 用Toplevel创建新窗口,而非第二个Tk() new_window = tk.Toplevel() new_window.minsize(width=200, height=200) new_window.title("Menu") nw_entry = tk.Entry(new_window, width=28) nw_entry.grid(column=0, row=3, padx=10, pady=10) # 添加发送按钮绑定send函数 send_btn = tk.Button(new_window, text="发送邮件", command=send) send_btn.grid(column=0, row=4, pady=5) def send(): # 获取输入并去除首尾空格 target_email = nw_entry.get().strip() # 检查输入是否为空 if not target_email: print("请输入有效的邮箱地址") return # 构造邮件 msg = EmailMessage() msg["From"] = my_email msg["Subject"] = "Menu" msg["To"] = target_email # 此处可添加邮件内容和smtplib发送逻辑 print(f"准备发送邮件到: {target_email}") # 主窗口初始化 root = tk.Tk() root.title("主窗口") open_btn = tk.Button(root, text="打开邮箱输入窗口", command=open_email_window) open_btn.pack(pady=20) root.mainloop()
更优雅的类封装方案(进阶推荐)
避免全局变量,用类管理组件和逻辑,适合后续扩展:
import tkinter as tk from email.message import EmailMessage my_email = "你的邮箱@example.com" class EmailSenderApp: def __init__(self, root): self.root = root self.root.title("主窗口") # 主窗口按钮 open_btn = tk.Button(root, text="打开邮箱输入窗口", command=self.open_email_window) open_btn.pack(pady=20) def open_email_window(self): # 创建新窗口 self.new_window = tk.Toplevel(self.root) self.new_window.minsize(width=200, height=200) self.new_window.title("Menu") # 把Entry设为类属性,send方法可直接访问 self.nw_entry = tk.Entry(self.new_window, width=28) self.nw_entry.grid(column=0, row=3, padx=10, pady=10) # 发送按钮 send_btn = tk.Button(self.new_window, text="发送邮件", command=self.send) send_btn.grid(column=0, row=4, pady=5) def send(self): target_email = self.nw_entry.get().strip() if not target_email: print("请输入有效的邮箱地址") return msg = EmailMessage() msg["From"] = my_email msg["Subject"] = "Menu" msg["To"] = target_email print(f"准备发送邮件到: {target_email}") if __name__ == "__main__": root = tk.Tk() app = EmailSenderApp(root) root.mainloop()
关键修正说明
- 用
Toplevel()替代Tk()创建新窗口,符合Tkinter的单主实例规则 - 全局变量方案通过
global声明让send()能访问Entry组件;类方案通过类属性管理组件,规避作用域问题 - 删除无效的
if send:判断,替换为输入有效性检查,避免逻辑错误
内容的提问来源于stack exchange,提问作者Sandra Heinz
相关产品推荐
相关产品推荐

