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

如何从Tkinter新窗口的Entry组件中获取值?

问题分析与解决方案

你的代码存在几个关键问题,导致get()调用失败和"Unresolved reference"错误,以下是逐一修正方案:

核心问题点

  1. 重复创建Tk实例:Tkinter仅允许一个主Tk()实例,新窗口必须用Toplevel()创建,否则会引发组件状态异常。
  2. 无效逻辑判断:if send:这行代码把函数名当作布尔值使用,逻辑完全错误,会导致后续代码执行异常。
  3. 变量作用域问题:如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:50:20