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
相关产品推荐
相关产品推荐

