Python tkcalendar的DateEntry能否单击箭头弹出日期下拉列表?
macOS下tkcalendar DateEntry单击箭头弹出日历的解决方案
在macOS Monterey 12.6.8系统中使用tkcalendar的DateEntry组件时,需双击旁侧的下拉箭头才能弹出日期选择列表,希望实现单击箭头直接弹出日历。原始代码如下:
import tkinter as tk from tkinter import ttk from tkcalendar import DateEntry window = tk.Tk() window.geometry("514x384+0+0") def show_date(): data = aDate.get() var.set(str(data)) var = tk.StringVar() label1 = ttk.Label(window, text="Please pick a Date:") label2 = ttk.Label(window,textvariable=var) aButton = ttk.Button(window,text = 'submit',command=show_date) aDate = DateEntry(window,selectmode='day') label1.grid(row=0,column=0) label2.grid(row=1,column=0) aDate.grid(row=2,column=0) aButton.grid(row=2,column=1) window.mainloop()
解决方案
这个问题和macOS平台下ttk组件的事件绑定逻辑有关,默认下拉箭头按钮只响应双击事件。我们可以通过手动绑定单击事件来修复:
- 找到DateEntry内部的下拉箭头按钮(组件的子元素中,类型为
ttk.Button的控件) - 给该按钮绑定
<Button-1>单击事件,触发DateEntry内部的_dropdown方法(此方法负责弹出日历选择面板)
修改后的完整代码:
import tkinter as tk from tkinter import ttk from tkcalendar import DateEntry window = tk.Tk() window.geometry("514x384+0+0") def show_date(): data = aDate.get() var.set(str(data)) var = tk.StringVar() label1 = ttk.Label(window, text="Please pick a Date:") label2 = ttk.Label(window,textvariable=var) aButton = ttk.Button(window,text = 'submit',command=show_date) aDate = DateEntry(window,selectmode='day') # 核心修改:获取下拉按钮并绑定单击事件 for child in aDate.winfo_children(): if isinstance(child, ttk.Button): child.bind('<Button-1>', lambda e: aDate._dropdown(e)) break label1.grid(row=0,column=0) label2.grid(row=1,column=0) aDate.grid(row=2,column=0) aButton.grid(row=2,column=1) window.mainloop()
说明
- 通过
winfo_children()遍历DateEntry的子组件,定位到下拉箭头对应的ttk.Button - 绑定单击事件后,调用组件内部的
_dropdown方法,实现单击弹出日历的效果 - 该方案无需修改tkcalendar源码,仅在业务代码中添加少量逻辑即可解决问题
内容的提问来源于stack exchange,提问作者suniu
相关产品推荐
相关产品推荐

