python ttk_带有ttk日历的Python tkinter

importcalendarimportsystry:importTkinterimporttkFontexceptImportError:# py3kimporttkinterasTkinterimporttkinter.fontastkFontimportttkdefget_calendar(locale,fwday):# instantiate proper calendar classiflocaleisNone:returncalendar.TextCalendar(fwday)else:returncalendar.LocaleTextCalendar(fwday,locale)classCalendar(ttk.Frame):# XXX ToDo: cget and configuredatetime=calendar.datetime.datetime

timedelta=calendar.datetime.timedeltadef__init__(self,master=None,**kw):"""

WIDGET-SPECIFIC OPTIONS

locale, firstweekday, year, month, selectbackground,

selectforeground

"""# remove custom options from kw before initializating ttk.Framefwday=kw.pop('firstweekday',calendar.MONDAY)year=kw.pop('year',self.datetime.now().year)month=kw.pop('month',self.datetime.now().month)locale=kw.pop('locale',None)sel_bg=kw.pop('selectbackground','#ecffc4')sel_fg=kw.pop('selectforeground','#05640e')self._date=self.datetime(year,month,1)self._selection=None# no date selectedttk.Frame.__init__(self,master,**kw)self._cal=get_calendar(locale,fwday)self.__setup_styles()# creates custom stylesself.__place_widgets()# pack/grid used widgetsself.__config_calendar()# adjust calendar columns and setup tags# configure a canvas, and proper bindings, for selecting datesself.__setup_selection(sel_bg,sel_fg)# store items ids, used for insertion laterself._items=[self._calendar.insert('','end',values='')for_inrange(6)]# insert dates in the currently empty calendarself._build_calendar()# set the minimal size for the widgetself._calendar.bind('',self.__minsize)def__setitem__(self,item,value):ifitemin('year','month'):raiseAttributeError("attribute '%s' is not writeable"%item)elifitem=='selectbackground':self._canvas['background']=valueelifitem=='selectforeground':self._canvas.itemconfigure(self._canvas.text,item=value)else:ttk.Frame.__setitem__(self,item,value)def__getitem__(self,item):ifitemin('year','month'):returngetattr(self._date,item)elifitem=='selectbackground':returnself._canvas['background']elifitem=='selectforeground':returnself._canvas.itemcget(self._canvas.text,'fill')else:r=ttk.tclobjs_to_py({item:ttk.Frame.__getitem__(self,item)})returnr[item]def__setup_styles(self):# custom ttk stylesstyle=ttk.Style(self.master)arrow_layout=lambdadir:([('Button.focus',{'children':[('Button.%sarrow'%dir,None)]})])style.layout('L.TButton',arrow_layout('left'))style.layout('R.TButton',arrow_layout('right'))def__place_widgets(self):# header frame and its widgetshframe=ttk.Frame(self)lbtn=ttk.Button(hframe,style='L.TButton',command=self._prev_month)rbtn=ttk.Button(hframe,style='R.TButton',command=self._next_month)self._header=ttk.Label(hframe,width=15,anchor='center')# the calendarself._calendar=ttk.Treeview(show='',selectmode='none',height=7)# pack the widgetshframe.pack(in_=self,side='top',pady=4,anchor='center')lbtn.grid(in_=hframe)self._header.grid(in_=hframe,column=1,row=0,padx=12)rbtn.grid(in_=hframe,column=2,row=0)self._calendar.pack(in_=self,expand=1,fill='both',side='bottom')def__config_calendar(self):cols=self._cal.formatweekheader(3).split()self._calendar['columns']=cols

self._calendar.tag_configure('header',background='grey90')self._calendar.insert('','end',values=cols,tag='header')# adjust its columns widthfont=tkFont.Font()maxwidth=max(font.measure(col)forcolincols)forcolincols:self._calendar.column(col,width=maxwidth,minwidth=maxwidth,anchor='e')def__setup_selection(self,sel_bg,sel_fg):self._font=tkFont.Font()self._canvas=canvas=Tkinter.Canvas(self._calendar,background=sel_bg,borderwidth=0,highlightthickness=0)canvas.text=canvas.create_text(0,0,fill=sel_fg,anchor='w')canvas.bind('',lambdaevt:canvas.place_forget())self._calendar.bind('',lambdaevt:canvas.place_forget())self._calendar.bind('',self._pressed)def__minsize(self,evt):width,height=self._calendar.master.geometry().split('x')height=height[:height.index('+')]self._calendar.master.minsize(width,height)def_build_calendar(self):year,month=self._date.year,self._date.month# update header text (Month, YEAR)header=self._cal.formatmonthname(year,month,0)self._header['text']=header.title()# update calendar shown datescal=self._cal.monthdayscalendar(year,month)forindx,iteminenumerate(self._items):week=cal[indx]ifindx

textw=self._font.measure(text)canvas=self._canvas

canvas.configure(width=width,height=height)canvas.coords(canvas.text,width-textw,height/2-1)canvas.itemconfigure(canvas.text,text=text)canvas.place(in_=self._calendar,x=x,y=y)# Callbacksdef_pressed(self,evt):"""Clicked somewhere in the calendar."""x,y,widget=evt.x,evt.y,evt.widget

item=widget.identify_row(y)column=widget.identify_column(x)ifnotcolumnornotiteminself._items:# clicked in the weekdays row or just outside the columnsreturnitem_values=widget.item(item)['values']ifnotlen(item_values):# row is empty for this monthreturntext=item_values[int(column[1])-1]ifnottext:# date is emptyreturnbbox=widget.bbox(item,column)ifnotbbox:# calendar not visible yetreturn# update and then show selectiontext='%02d'%text

self._selection=(text,item,column)self._show_selection(text,bbox)def_prev_month(self):"""Updated calendar to show the previous month."""self._canvas.place_forget()self._date=self._date-self.timedelta(days=1)self._date=self.datetime(self._date.year,self._date.month,1)self._build_calendar()# reconstuct calendardef_next_month(self):"""Update calendar to show the next month."""self._canvas.place_forget()year,month=self._date.year,self._date.month

self._date=self._date+self.timedelta(days=calendar.monthrange(year,month)[1]+1)self._date=self.datetime(self._date.year,self._date.month,1)self._build_calendar()# reconstruct calendar# Properties@propertydefselection(self):"""Return a datetime representing the current selected date."""ifnotself._selection:returnNoneyear,month=self._date.year,self._date.monthreturnself.datetime(year,month,int(self._selection[0]))defmyfunction():root2=Tkinter.Toplevel(root)ttkcal=Calendar(root2,firstweekday=calendar.SUNDAY)ttkcal.pack(expand=1,fill='both')root=Tkinter.Tk()frame=Tkinter.Frame(root)frame.pack(side="left")button=Tkinter.Button(root,text="Top level",command=myfunction)button.pack(side="right")ttkcal=Calendar(frame,firstweekday=calendar.SUNDAY)ttkcal.pack(expand=1,fill='both')root.mainloop()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很好,这是一个关于编程的问题,我可以回答。您可以使用 Python tkinter 模块中的 Calendar 组件来创建一个日历控件。您可以将此组件添加到您的应用程序中,并以不同的方式自定义它。示例代码如下: ```python import tkinter as tk from tkinter import ttk import calendar class Calendar: def __init__(self, master): self.master = master self.master.title("Calendar") self.cal = calendar.Calendar() self.year = tk.IntVar() self.month = tk.IntVar() self.year.set(2022) self.month.set(6) self.year_label = ttk.Label(self.master, text="Year:") self.month_label = ttk.Label(self.master, text="Month:") self.year_spinbox = tk.Spinbox(self.master, from_=1, to=9999, width=5, textvariable=self.year) self.month_spinbox = tk.Spinbox(self.master, from_=1, to=12, width=3, textvariable=self.month) self.year_label.grid(row=0, column=0, sticky="w") self.month_label.grid(row=0, column=1, sticky="w") self.year_spinbox.grid(row=1, column=0, sticky="w") self.month_spinbox.grid(row=1, column=1, sticky="w") self.calendar_widget = ttk.Treeview(self.master, selectmode="none", columns=("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"), show="headings") self.calendar_widget.column("Mon", width=50, anchor="c") self.calendar_widget.column("Tue", width=50, anchor="c") self.calendar_widget.column("Wed", width=50, anchor="c") self.calendar_widget.column("Thu", width=50, anchor="c") self.calendar_widget.column("Fri", width=50, anchor="c") self.calendar_widget.column("Sat", width=50, anchor="c") self.calendar_widget.column("Sun", width=50, anchor="c") self.calendar_widget.heading("Mon", text="Mon") self.calendar_widget.heading("Tue", text="Tue") self.calendar_widget.heading("Wed", text="Wed") self.calendar_widget.heading("Thu", text="Thu") self.calendar_widget.heading("Fri", text="Fri") self.calendar_widget.heading("Sat", text="Sat") self.calendar_widget.heading("Sun", text="Sun") self.populate_calendar() self.calendar_widget.grid(row=2, column=0, columnspan=2) def populate_calendar(self): year = self.year.get() month = self.month.get() month_days = self.cal.monthdayscalendar(year, month) for i in self.calendar_widget.get_children(): self.calendar_widget.delete(i) for date in month_days: self.calendar_widget.insert("", tk.END, values=date) root = tk.Tk() app = Calendar(root) root.mainloop() ``` 此代码将创建一个包含 “年” 和 “月” 两个标签的窗口。在其中,可以选择年份和月份,然后在 “日历” 中显示该月份的日历。 希望这对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值