如何在tkinter中创建日期选择器?

MKa*_*ras 30 python tkinter

有没有标准方式tkinter应用程序允许用户选择日期?

Nic*_*ley 18

不,Tk不包括日期选择器小部件.您可以尝试使用几个Python日历小部件:

http://svn.python.org/projects/sandbox/trunk/ttk-gsoc/samples/ttkcalendar.py

http://effbot.org/zone/wcklib-calendar.htm

  • 作为一名ex-tcl/tk开发人员,我只需要几次我需要一次.由于tcl(和python)具有可以为您提供数据的日期例程,因此创建起来相当简单.您需要做的就是创建一个按钮网格或类似的东西. (2认同)

Mos*_*she 10

不是我能找到的.对于任何想要在未来这样做的人:

我使用tkSimpleDialogttkcalendar.py(从这个 SO帖子修改)来制作CalendarDialog.这三个文件的修改版本可以在我的github上找到.

下面是CalendarDialog.py中的代码:

import Tkinter

import ttkcalendar
import tkSimpleDialog

class CalendarDialog(tkSimpleDialog.Dialog):
    """Dialog box that displays a calendar and returns the selected date"""
    def body(self, master):
        self.calendar = ttkcalendar.Calendar(master)
        self.calendar.pack()

    def apply(self):
        self.result = self.calendar.selection

# Demo code:
def main():
    root = Tkinter.Tk()
    root.wm_title("CalendarDialog Demo")

    def onclick():
        cd = CalendarDialog(root)
        print cd.result

    button = Tkinter.Button(root, text="Click me to see a calendar!", command=onclick)
    button.pack()
    root.update()

    root.mainloop()


if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

  • 嘿,你链接的python源文件实际上并没有对它进行那些修改 - 遇到了绊脚石,直到我意识到它必须被修改才能让它与真正的Tkinter应用程序玩得很好:P (2认同)

Gar*_*ari 10

如果有人仍然需要这个 - 这是一个使用tkcalendar包创建Calendar和DateEntry小部件的简单代码.

pip install tkcalendar [用于安装包]

try:
    import tkinter as tk
    from tkinter import ttk
except ImportError:
    import Tkinter as tk
    import ttk

from tkcalendar import Calendar, DateEntry

def example1():
    def print_sel():
        print(cal.selection_get())

    top = tk.Toplevel(root)

    cal = Calendar(top,
                   font="Arial 14", selectmode='day',
                   cursor="hand1", year=2018, month=2, day=5)
    cal.pack(fill="both", expand=True)
    ttk.Button(top, text="ok", command=print_sel).pack()

def example2():
    top = tk.Toplevel(root)

    ttk.Label(top, text='Choose date').pack(padx=10, pady=10)

    cal = DateEntry(top, width=12, background='darkblue',
                    foreground='white', borderwidth=2)
    cal.pack(padx=10, pady=10)

root = tk.Tk()
s = ttk.Style(root)
s.theme_use('clam')

ttk.Button(root, text='Calendar', command=example1).pack(padx=10, pady=10)
ttk.Button(root, text='DateEntry', command=example2).pack(padx=10, pady=10)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)


小智 10

请尝试以下操作:

from tkinter import *

from tkcalendar import Calendar,DateEntry

root = Tk()

cal = DateEntry(root,width=30,bg="darkblue",fg="white",year=2010)

cal.grid()

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

其中tkcalendar图书馆应下载并通过安装pip install tkcalender命令。


mer*_*dad 6

这里的答案提供了您所要求的大部分内容,但我觉得没有一个是完全令人满意的。作为 Tkinter 新手,我需要更多指导。我的抱怨:

  1. 假设我希望日历默认为 2012 年日期而不是今天的日期,
  2. 不将结果作为变量返回以供将来使用,
  3. 进入日历之前不必要的顶层菜单,以及
  4. 在做出选择后不清理窗口并退出主循环。

因此,感谢之前对我有很大帮助的答案,这是我的版本。

def get_date():
    import tkinter as tk
    from tkinter import ttk
    from tkcalendar import Calendar, DateEntry

    def cal_done():
        top.withdraw()
        root.quit()

    root = tk.Tk()
    root.withdraw() # keep the root window from appearing

    top = tk.Toplevel(root)

    cal = Calendar(top,
                   font="Arial 14", selectmode='day',
                   cursor="hand1")
    cal.pack(fill="both", expand=True)
    ttk.Button(top, text="ok", command=cal_done).pack()

    selected_date = None
    root.mainloop()
    return cal.selection_get()

selection = get_date()
print(selection)
Run Code Online (Sandbox Code Playgroud)


小智 5

不,但您可以从用户那里获取它作为格式化字符串中的日期时间元素。

例子:

import datetime

userdatestring = '2013-05-10'
thedate = datetime.datetime.strptime(userdatestring, '%Y-%m-%d') 
Run Code Online (Sandbox Code Playgroud)

查看http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior。它很方便,虽然不是最用户友好的约会方式。