tkcalendar调用get_date()方法抛出AttributeError:'NoneType'对象无get_date属性问题求助
解决tkcalendar调用get_date()时的AttributeError问题
嘿,我一眼就发现问题所在啦!你遇到的AttributeError: 'NoneType' object has no attribute 'get_date',根源出在组件创建和布局的写法上。
错误原因
在Tkinter(包括tkcalendar)里,pack()、grid()、place()这些布局方法返回的都是None。你把Calendar组件的创建和pack()写在了同一行:
self.startCalendar = Calendar(...).pack(fill=X, pady=(0, 5))
这就导致self.startCalendar被赋值成了pack()的返回值——也就是None,而不是Calendar组件对象本身。当你在btn_click()里调用self.startCalendar.get_date()时,自然就会报错啦。
修复方案
把组件创建和布局操作分开写:先创建Calendar对象并赋值给self.startCalendar,再单独调用它的pack()方法。修改后的代码片段如下:
class Main(Frame): def __init__(self, parent): super(Main, self).__init__(parent) padding = 10 # calenders mainCalendarFrame = Frame(root) # start startCalendarFrame = Frame(mainCalendarFrame) startLabel = Label(startCalendarFrame, text='Start') startLabel.pack(fill=X, pady=(0, padding)) # 分开布局 # 先创建Calendar对象,再单独执行pack self.startCalendar = Calendar(startCalendarFrame, selectmode='day', year=int(date.today().strftime('%Y')), month=int(date.today().strftime('%m')), day=int(date.today().strftime('%d'))) self.startCalendar.pack(fill=X, pady=(0, 5)) mainCalendarFrame.pack(padx=padding, pady=padding) settingsFrame.pack(fill=X, padx=padding, pady=padding) btnCalculate.pack(fill=X, padx=padding, pady=padding) def btn_click(self): print(self.startCalendar.get_date())
额外提示
不光是Calendar组件,Tkinter里所有的Widget(比如Label、Button这些)都要注意这个问题——永远不要把创建组件和布局方法写在同一行赋值,否则变量会变成None,后续调用组件方法就会触发类似的错误。
内容的提问来源于stack exchange,提问作者samuelhertrich
相关产品推荐
相关产品推荐

