python tkinter 日历
python的tkinter包,在桌面上显示日历
从别处copy来的,谢谢
import calendar
import tkinter as tk
import tkinter.font as tkFont
from tkinter import ttk
from tkinter.filedialog import *
from tkinter.messagebox import *
from operate import MAIN_OPERATE
from datetime import datetimeclass Calendar:def __init__(s, point = None):s.master = tk.Toplevel()s.master.withdraw()s.master.attributes('-topmost' ,True)fwday = calendar.SUNDAYyear = datetime.now().yearmonth = datetime.now().monthlocale = Nonesel_bg = '#ecffc4'sel_fg = '#05640e's._date = datetime(year, month, 1) #每月第一日s._selection = None #设置为未选中日期s.G_Frame = ttk.Frame(s.master)s._cal = s.__get_calendar(locale, fwday)s.__setup_styles() # 创建自定义样式s.__place_widgets() # pack/grid 小部件s.__config_calendar() # 调整日历列和安装标记# 配置画布和正确的绑定,以选择日期。s.__setup_selection(sel_bg, sel_fg)# 存储项ID,用于稍后插入。s._items = [s._calendar.insert('', 'end', values='') for _ in range(6)]# 在当前空日历中插入日期s._update()s.G_Frame.pack(expand = 1, fill = 'both')s.master.overrideredirect(1)s.master.update_idletasks()width, height = s.master.winfo_reqwidth(), s.master.winfo_reqheight()s.height=heightif point:x, y = point[0], point[1]else:x, y = (s.master.winfo_screenwidth() - width)/2, (s.master.winfo_screenheight() - height)/2s.master.geometry('%dx%d+%d+%d' % (width, height, x, y)) #窗口位置居中s.master.after(300, s._main_judge)s.master.deiconify()s.master.focus_set()s.master.wait_window() #这里应该使用wait_window挂起窗口,如果使用mainloop,可能会导致主程序很多错误def __get_calendar(s, locale, fwday):if locale is None:return calendar.TextCalendar(fwday)else:return calendar.LocaleTextCalendar(fwday, locale)def __setitem__(s, item, value):if item in ('year', 'month'):raise AttributeError("attribute '%s' is not writeable" % item)elif item == 'selectbackground':s._canvas['background'] = valueelif item == 'selectforeground':s._canvas.itemconfigure(s._canvas.text, item=value)else:s.G_Frame.__setitem__(s, item, value)def __getitem__(s, item):if item in ('year', 'month'):return getattr(s._date, item)elif item == 'selectbackground':return s._canvas['background']elif item == 'selectforeground':return s._canvas.itemcget(s._canvas.text, 'fill')else:r = ttk.tclobjs_to_py({item: ttk.Frame.__getitem__(s, item)})return r[item]def __setup_styles(s):# 自定义TTK风格style = ttk.Style(s.master)arrow_layout = lambda dir: ([('Button.focus', {'children': [('Button.%sarrow' % dir, None)]})])style.layout('L.TButton', arrow_layout('left'))style.layout('R.TButton', arrow_layout('right'))def __place_widgets(s):# 标头框架及其小部件Input_judgment_num = s.master.register(s.Input_judgment) # 需要将函数包装一下,必要的hframe = ttk.Frame(s.G_Frame)gframe = ttk.Frame(s.G_Frame)bframe = ttk.Frame(s.G_Frame)hframe.pack(in_=s.G_Frame, side='top', pady=5, anchor='center')gframe.pack(in_=s.G_Frame, fill=tk.X, pady=5)bframe.pack(in_=s.G_Frame, side='bottom', pady=5)lbtn = ttk.Button(hframe, style='L.TButton', command=s._prev_month)lbtn.grid(in_=hframe, column=0, row=0, padx=12)rbtn = ttk.Button(hframe, style='R.TButton', command=s._next_month)rbtn.grid(in_=hframe, column=5, row=0, padx=12)s.CB_year = ttk.Combobox(hframe, width = 5, values = [str(year) for year in range(datetime.now().year, datetime.now().year-11,-1)], validate = 'key', validatecommand = (Input_judgment_num, '%P'))s.CB_year.current(0)s.CB_year.grid(in_=hframe, column=1, row=0)s.CB_year.bind('<KeyPress>', lambda event:s._update(event, True))s.CB_year.bind("<<ComboboxSelected>>", s._update)tk.Label(hframe, text = '年', justify = 'left').grid(in_=hframe, column=2, row=0, padx=(0,5))s.CB_month = ttk.Combobox(hframe, width = 3, values = ['%02d' % month for month in range(1,13)], state = 'readonly')s.CB_month.current(datetime.now().month - 1)s.CB_month.grid(in_=hframe, column=3, row=0)s.CB_month.bind("<<ComboboxSelected>>", s._update)tk.Label(hframe, text = '月', justify = 'left').grid(in_=hframe, column=4, row=0)# 日历部件s._calendar = ttk.Treeview(gframe, show='', selectmode='none', height=7)s._calendar.pack(expand=1, fill='both', side='bottom', padx=5)ttk.Button(bframe, text = "确 定", width = 6, command = lambda: s._exit(True)).grid(row = 0, column = 0, sticky = 'ns', padx = 20)ttk.Button(bframe, text = "取 消", width = 6, command = s._exit).grid(row = 0, column = 1, sticky = 'ne', padx = 20)tk.Frame(s.G_Frame, bg = '#565656').place(x = 0, y = 0, relx = 0, rely = 0, relwidth = 1, relheigh = 2/200)tk.Frame(s.G_Frame, bg = '#565656').place(x = 0, y = 0, relx = 0, rely = 198/200, relwidth = 1, relheigh = 2/200)tk.Frame(s.G_Frame, bg = '#565656').place(x = 0, y = 0, relx = 0, rely = 0, relwidth = 2/200, relheigh = 1)tk.Frame(s.G_Frame, bg = '#565656').place(x = 0, y = 0, relx = 198/200, rely = 0, relwidth = 2/200, relheigh = 1)def __config_calendar(s):# cols = s._cal.formatweekheader(3).split()cols = ['日','一','二','三','四','五','六']s._calendar['columns'] = colss._calendar.tag_configure('header', background='grey90')s._calendar.insert('', 'end', values=cols, tag='header')# 调整其列宽font = tkFont.Font()maxwidth = max(font.measure(col) for col in cols)for col in cols:s._calendar.column(col, width=maxwidth, minwidth=maxwidth,anchor='center')def __setup_selection(s, sel_bg, sel_fg):def __canvas_forget(evt):canvas.place_forget()s._selection = Nones._font = tkFont.Font()s._canvas = canvas = tk.Canvas(s._calendar, background=sel_bg, borderwidth=0, highlightthickness=0)canvas.text = canvas.create_text(0, 0, fill=sel_fg, anchor='w')canvas.bind('<Button-1>', __canvas_forget)s._calendar.bind('<Configure>', __canvas_forget)s._calendar.bind('<Button-1>', s._pressed)def _build_calendar(s):year, month = s._date.year, s._date.monthheader = s._cal.formatmonthname(year, month, 0)# 更新日历显示的日期cal = s._cal.monthdayscalendar(year, month)for indx, item in enumerate(s._items):week = cal[indx] if indx < len(cal) else []fmt_week = [('%02d' % day) if day else '' for day in week]s._calendar.item(item, values=fmt_week)def _show_select(s, text, bbox):x, y, width, height = bboxtextw = s._font.measure(text)canvas = s._canvascanvas.configure(width = width, height = height)canvas.coords(canvas.text, (width - textw)/2, height / 2 - 1)canvas.itemconfigure(canvas.text, text=text)canvas.place(in_=s._calendar, x=x, y=y)def _pressed(s, evt = None, item = None, column = None, widget = None):"""在日历的某个地方点击。"""if not item:x, y, widget = evt.x, evt.y, evt.widgetitem = widget.identify_row(y)column = widget.identify_column(x)if not column or not item in s._items:# 在工作日行中单击或仅在列外单击。returnitem_values = widget.item(item)['values']if not len(item_values): # 这个月的行是空的。returntext = item_values[int(column[1]) - 1]if not text:returnbbox = widget.bbox(item, column)if not bbox: # 日历尚不可见s.master.after(20, lambda : s._pressed(item = item, column = column, widget = widget))returntext = '%02d' % texts._selection = (text, item, column)s._show_select(text, bbox)def _prev_month(s):"""更新日历以显示前一个月。"""s._canvas.place_forget()s._selection = Nones._date = s._date - timedelta(days=1)s._date = datetime(s._date.year, s._date.month, 1)s.CB_year.set(s._date.year)s.CB_month.set(s._date.month)s._update()def _next_month(s):"""更新日历以显示下一个月。"""s._canvas.place_forget()s._selection = Noneyear, month = s._date.year, s._date.months._date = s._date + timedelta(days=calendar.monthrange(year, month)[1] + 1)s._date = datetime(s._date.year, s._date.month, 1)s.CB_year.set(s._date.year)s.CB_month.set(s._date.month)s._update()def _update(s, event = None, key = None):"""刷新界面"""if key and event.keysym != 'Return': returnyear = int(s.CB_year.get())month = int(s.CB_month.get())if year == 0 or year > 9999: returns._canvas.place_forget()s._date = datetime(year, month, 1)s._build_calendar() # 重建日历if year == datetime.now().year and month == datetime.now().month:day = datetime.now().dayfor _item, day_list in enumerate(s._cal.monthdayscalendar(year, month)):if day in day_list:item = 'I00' + str(_item + 2)column = '#' + str(day_list.index(day)+1)s.master.after(100, lambda :s._pressed(item = item, column = column, widget = s._calendar))def _exit(s, confirm = False):if not confirm: s._selection = Nones.master.destroy()def _main_judge(s):"""判断窗口是否在最顶层"""try:if s.master.focus_displayof() == None or 'toplevel' not in str(s.master.focus_displayof()): s._exit()else: s.master.after(10, s._main_judge)except:s.master.after(10, s._main_judge)def selection(s):"""返回表示当前选定日期的日期时间。"""if not s._selection: return Noneyear, month = s._date.year, s._date.monthreturn str(datetime(year, month, int(s._selection[0])))[:10]def Input_judgment(s, content):"""输入判断"""if content.isdigit() or content == "":return Trueelse:return False
python tkinter 日历相关推荐
- python生成日历_Python创建日历实例代码
Python创建日历的方法 以下代码不使用Python提供的calendar实现. 此程序在windows下测试通过,由于python字符编码直接输出给操作系统,so win下以gbk ansi为准, ...
- python tkinter设置窗口大小_Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例...
我就废话不多说了.大家直接看代码吧! #!/usr/bin/env python #coding=utf-8 ''' 窗口屏幕居中,设置窗口最大,最小尺寸... 版权所有 2014 yao_yu (h ...
- python tkinter库、添加gui界面_使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)...
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二),创建一个,界面,布局,文件,路径 使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二) ...
- python界面不同按钮实现不同功能-python tkinter实现界面切换的示例代码
跳转实现思路 主程序相当于桌子: import tkinter as tk root = tk.Tk() 而不同的Frame相当于不同的桌布: face1 = tk.Frame(root) face2 ...
- tkinter回调异常_处理python tkinter中的异常
我在 Python Tkinter中编写了一个应用程序.我最近注意到,对于其中一个操作,如果该操作失败,它有时会关闭(不会给出任何错误).我写了一个小程序来说明问题: – import os from ...
- python Tkinter Text的简单用法
1.设置python Tkinter Text控件文本的方法 text.insert(index,string) index = x.y的形式,x表示行,y表示列 向第一行插入数据,text.ins ...
- python tkinter输入框_python TKinter获取文本框内容的方法
python TKinter获取文本框内容的方法 更新时间:2018年10月11日 11:36:08 作者:biubiuzzz 今天小编就为大家分享一篇python TKinter获取文本框内容的方法 ...
- python tkinter chk
python tkinter chk 视频过程中的练习, 可以在python2.7下运行.001: hello,world:1 2 3 4 5 6 from Tkinter import Label, ...
- python tkinter计算器实例_Python编程使用tkinter模块实现计算器软件完整代码示例
Python 提供了多个图形开发界面的库.Tkinter就是其中之一. Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数 ...
最新文章
- redis集群scan_利用scan迁移部分单点redis数据到RedisCluster
- 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
- 如何让搜索引擎抓取AJAX内容
- linux 下转换UTC到本地时间
- 【线上分享】华为云视频的Cloud Native实践
- alarm项目bug
- elementui中给input框赋值成功后input框不能进行编辑问题
- solaris 查看CPU资源占用情况!
- wordpress建立二级导航菜单
- 如何快速制作出精致的ppt模板?
- 逻辑思维训练开发你的思维激发你的大脑
- android开机加速器,安卓手机开机如何加速
- 餐饮加盟行业怎么找加盟商?线上怎么引流?这几招教你线上低成本获客!
- 自助式拍照打卡签到活动,亚运地点拍照打卡活动,<h2>JavaScript ISO
- html简洁风格的个人博客网站模板(源码)
- Windows10安装WDK报错setup cannot locate windows debugging wdk integration-x86_en-us.msi
- phantomjs 配置和使用_安装和使用PhantomJS
- 获取自然周;一年中总的周数,以及当前日期处于第几周
- ubuntu使用自定义鼠标主题
- 秒懂频分多址FDMA、时分多址TDMA、码分多址CDMA、空分多址SDMA
热门文章
- 学完计算机专业英语感受,计算机专业英语感想
- Navicat Premium连接服务器数据库不成功的原因
- 盖亚绘制的星图里,藏着银河系不为人知的混乱过去
- 华为独家承建波兰P4 UMTS网络
- ubuntu 出现device not managed,解决方法
- 项目轮播图功能实现和导航栏的实现
- UE4 Gameplay
- win10系统装服务器2008蓝屏,win10蓝屏 重装系统还是蓝屏
- php 项目反应理论,科学网—好文 | 纽约石溪大学:机器学习中基于项目反应理论的集成学习 - 陈培颖的博文...
- 逻辑回归阈值_逻辑回归算法