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 日历相关推荐

  1. python生成日历_Python创建日历实例代码

    Python创建日历的方法 以下代码不使用Python提供的calendar实现. 此程序在windows下测试通过,由于python字符编码直接输出给操作系统,so win下以gbk ansi为准, ...

  2. python tkinter设置窗口大小_Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例...

    我就废话不多说了.大家直接看代码吧! #!/usr/bin/env python #coding=utf-8 ''' 窗口屏幕居中,设置窗口最大,最小尺寸... 版权所有 2014 yao_yu (h ...

  3. python tkinter库、添加gui界面_使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)...

    使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二),创建一个,界面,布局,文件,路径 使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二) ...

  4. python界面不同按钮实现不同功能-python tkinter实现界面切换的示例代码

    跳转实现思路 主程序相当于桌子: import tkinter as tk root = tk.Tk() 而不同的Frame相当于不同的桌布: face1 = tk.Frame(root) face2 ...

  5. tkinter回调异常_处理python tkinter中的异常

    我在 Python Tkinter中编写了一个应用程序.我最近注意到,对于其中一个操作,如果该操作失败,它有时会关闭(不会给出任何错误).我写了一个小程序来说明问题: – import os from ...

  6. python Tkinter Text的简单用法

    1.设置python Tkinter Text控件文本的方法 text.insert(index,string)  index = x.y的形式,x表示行,y表示列 向第一行插入数据,text.ins ...

  7. python tkinter输入框_python TKinter获取文本框内容的方法

    python TKinter获取文本框内容的方法 更新时间:2018年10月11日 11:36:08 作者:biubiuzzz 今天小编就为大家分享一篇python TKinter获取文本框内容的方法 ...

  8. python tkinter chk

    python tkinter chk 视频过程中的练习, 可以在python2.7下运行.001: hello,world:1 2 3 4 5 6 from Tkinter import Label, ...

  9. python tkinter计算器实例_Python编程使用tkinter模块实现计算器软件完整代码示例

    Python 提供了多个图形开发界面的库.Tkinter就是其中之一. Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数 ...

最新文章

  1. redis集群scan_利用scan迁移部分单点redis数据到RedisCluster
  2. 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
  3. 如何让搜索引擎抓取AJAX内容
  4. linux 下转换UTC到本地时间
  5. 【线上分享】华为云视频的Cloud Native实践
  6. alarm项目bug
  7. elementui中给input框赋值成功后input框不能进行编辑问题
  8. solaris 查看CPU资源占用情况!
  9. wordpress建立二级导航菜单
  10. 如何快速制作出精致的ppt模板?
  11. 逻辑思维训练开发你的思维激发你的大脑
  12. android开机加速器,安卓手机开机如何加速
  13. 餐饮加盟行业怎么找加盟商?线上怎么引流?这几招教你线上低成本获客!
  14. 自助式拍照打卡签到活动,亚运地点拍照打卡活动,<h2>JavaScript ISO
  15. html简洁风格的个人博客网站模板(源码)
  16. Windows10安装WDK报错setup cannot locate windows debugging wdk integration-x86_en-us.msi
  17. phantomjs 配置和使用_安装和使用PhantomJS
  18. 获取自然周;一年中总的周数,以及当前日期处于第几周
  19. ubuntu使用自定义鼠标主题
  20. 秒懂频分多址FDMA、时分多址TDMA、码分多址CDMA、空分多址SDMA

热门文章

  1. 学完计算机专业英语感受,计算机专业英语感想
  2. Navicat Premium连接服务器数据库不成功的原因
  3. 盖亚绘制的星图里,藏着银河系不为人知的混乱过去
  4. 华为独家承建波兰P4 UMTS网络
  5. ubuntu 出现device not managed,解决方法
  6. 项目轮播图功能实现和导航栏的实现
  7. UE4 Gameplay
  8. win10系统装服务器2008蓝屏,win10蓝屏 重装系统还是蓝屏
  9. php 项目反应理论,科学网—好文 | 纽约石溪大学:机器学习中基于项目反应理论的集成学习 - 陈培颖的博文...
  10. 逻辑回归阈值_逻辑回归算法