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

Python Tkinter报错"Example object has no attribute tk"问题求助

Tkinter日期时间输入程序修复方案

核心报错原因

  • 导入位置错误:import tkinter as tk写在了主函数执行块内,类定义阶段无法识别tk命名空间,同时重复用from tkinter import *和import tkinter as tk属于冗余导入,建议保留后者即可。
  • Entry控件父容器错误:dateFromUser = tk.Entry(self)中传入的self是Example类的实例,不是合法的Tkinter容器对象,Entry的第一个参数必须是Tk()/Toplevel()/Frame这类tk容器组件,且此处重复创建日期输入框属于冗余逻辑,直接使用之前创建的dateEntry即可。
  • 取值方式错误:要获取Entry控件的输入内容需要调用.get()方法,直接对Entry对象做str转换只会得到控件的内存标识,无法拿到用户输入的文本。

其他问题修正

  • 移除重复创建的Tk实例:原有代码同时创建了两个Tk根窗口,子窗口统一用Toplevel实现即可,避免多根窗口导致的逻辑异常。
  • 修复geometry属性设置错误:new_window.geometry = ("500x500")是错误写法,正确语法为new_window.geometry("500x500")。
  • 修正局部变量无法访问的问题:将日期、时间输入框存为类的实例属性,确保提交按钮的回调函数可以正常访问到输入控件。
  • 调整校验逻辑执行时机:校验逻辑放到提交按钮的回调中执行,避免组件刚创建用户还未输入就提前校验。

修正后完整代码

import tkinter as tk
from tkinter import Label, Entry, Button
import datetime

class Example():
    # 数据成员 
    __dateEntry = None
    __timeEntry = None
    exampleList = []

    def UserInputWindow(self, windowName, instruction):
        # 创建子窗口,不用重复创建Tk根窗口
        new_window = tk.Toplevel()
        new_window.title(f'{windowName}')
        new_window.geometry("500x500")

        # 显示说明标签
        label_instruction = Label(new_window, text = f'{instruction}', font = ("Courier", 10), justify = tk.LEFT, fg = "black", bg = "light yellow")
        label_instruction.grid(row = 0, column = 0)
        return new_window

    # 校验日期格式
    def VerifyDate(self, d):
        try:
            datetime.datetime.strptime(d, "%m/%d/%Y")
            return True
        except ValueError:
            # 可自行替换为弹窗提示逻辑
            print("日期格式错误,请输入MM/DD/YYYY格式的日期")
            return False

    # 校验时间格式
    def VerifyTime(self, t):
        try:
            datetime.datetime.strptime(t, "%H:%M")
            return True
        except ValueError:
            # 可自行替换为弹窗提示逻辑
            print("时间格式错误,请输入hh:mm格式的时间")
            return False

    # 生成日期时间输入表单
    def PromptDateTime(self, new_window):
        label_instruction = Label(new_window, text = "Enter activity date and time: ",font = ("Courier", 10), justify = tk.LEFT, fg = "black", bg = "light yellow")
        label_instruction.grid(row = 0, column = 0)

        # 日期输入框
        label_date = Label(new_window, text = "Enter date in MM/DD/YYYY format: ",fg = "black", bg = "white")
        label_date.grid(row = 1, column = 0, padx = 5)
        self.__dateEntry = Entry(new_window, fg = 'black', bg = 'white', width = 10)
        self.__dateEntry.grid(row = 2, column = 0, padx = 5)
       
        # 时间输入框
        label_time = Label(new_window, text = "Enter time in hh:mm format (military time): ",fg = "black", bg = "white")
        label_time.grid(row = 3, column = 0, padx = 5)
        self.__timeEntry = Entry(new_window, fg = 'black', bg = 'white', width = 10)
        self.__timeEntry.grid(row = 4, column = 0, padx = 5)

    def SubmitButton(self, new_window, new_command):
        button_submit = Button(new_window, fg = "black", bg = "light blue", text = "Submit", command = new_command)
        button_submit.grid(row = 17, column = 0, pady = 5)

    # 提交回调逻辑
    def submit_callback(self):
        date_str = self.__dateEntry.get().strip()
        time_str = self.__timeEntry.get().strip()
        if self.VerifyDate(date_str) and self.VerifyTime(time_str):
            # 可自行替换为otherClass实例化逻辑
            self.exampleList.append(f"{date_str} {time_str}")
            print("添加成功,当前列表:", self.exampleList)

    def PromptAndAddToList(self):
        window = self.UserInputWindow('Date and Time', 'Enter date and time as specified below.')
        self.PromptDateTime(window)
        self.SubmitButton(window, self.submit_callback)

if __name__ == '__main__':
    root = tk.Tk()
    root.withdraw()
    ex = Example()
    ex.PromptAndAddToList()
    root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:27:01