吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8369|回复: 36
收起左侧

[原创工具] 日历打印器 v3.1

  [复制链接]
马可solo 发表于 2021-7-15 23:53
本帖最后由 马可solo 于 2021-7-19 19:18 编辑

日历打印器 v3.1

对着《程序设计思想与方法》一步步抄出来的,边写边学,原来是python2的代码,对应python3进行了改写。

  • 功能:输入年份(v3.0之前 1900之后),打印日历(v1.0 命令行 / v2.0及之后 txt文本文件)。
v1.0源代码:
# calendar printer v1.0

def getYear():
    print("日历打印器 v1.0")
    year = int(input("请输入要打印的年份(1900年之后):"))
    return year

def firstDay(year):
    k = leapyears(year)
    n = (year - 1900) * 365 + k
    return (n + 1) % 7

def leapyears(year):
    count = 0
    for y in range(1900,year):
        if y%4 == 0 and (y%100 != 0 or y%400 == 0):
            count = count + 1
    return count

def printCalendar(year,w):
    print
    print("=========== " + str(year) + " ===========")
    first = w
    for month in range(12):
        heading(month)
        first = oneMonth(year,month,first)

def heading(m):
    months = ["Jan","Feb","Mar","Apr","May","Jun","July","Aug","Sep","Oct","Nov","Dec"]
    print("            %s           " % (months[m]))
    print("Mon Tue Wed Thu Fri Sat Sun")

def oneMonth(year,month,first):
    d = days(year,month)
    frame = layout(first,d)
    printMonth(frame)
    return (first + d) % 7

def days(y,m):
    month_days = [31,28,31,30,31,30,31,31,30,31,30,31]
    d = month_days[m]
    if (m == 1) and (y%4 == 0 and (y%100 != 0 or y%400 == 0)):
        d = d + 1
    return d

def layout(first,d):
    frame = 42 * [""]
    if first == 0:
        first = 7
    j = first - 1
    for i in range(1,d+1):
        frame[j] = i
        j = j + 1
    return frame

def printMonth(frame):
    for i in range(42):
        print("%3s" % (frame[i]),end=" ")
        if (i+1)%7 == 0:
            print()

def main():
    year = getYear()
    print()
    w = firstDay(year)
    printCalendar(year,w)
    print()
    input("按回车退出...")

main()
v2.0源代码(加入GUI,输出txt文本文件):
# 日历打印器 v2.0
# calendar printer v2.0

# 内核

content = []

def firstDay(year):
    k = leapyears(year)
    n = (year - 1900) * 365 + k
    return (n + 1) % 7

def leapyears(year):
    count = 0
    for y in range(1900,year):
        if y%4 == 0 and (y%100 != 0 or y%400 == 0):
            count = count + 1
    return count

def printCalendar(year,w):
    content.append("=========== " + str(year) + " ==========\n")
    content.append('\n')
    first = w
    for month in range(12):
        heading(month)
        first = oneMonth(year,month,first)

def heading(m):
    months = ["Jan","Feb","Mar","Apr","May","Jun","July","Aug","Sep","Oct","Nov","Dec"]
    content.append("            %s           \n" % (months[m]))
    content.append("Mon Tue Wed Thu Fri Sat Sun\n")

def oneMonth(year,month,first):
    d = days(year,month)
    frame = layout(first,d)
    printMonth(frame)
    return (first + d) % 7

def days(y,m):
    month_days = [31,28,31,30,31,30,31,31,30,31,30,31]
    d = month_days[m]
    if (m == 1) and (y%4 == 0 and (y%100 != 0 or y%400 == 0)):
        d = d + 1
    return d

def layout(first,d):
    frame = 42 * [""]
    if first == 0:
        first = 7
    j = first - 1
    for i in range(1,d+1):
        frame[j] = i
        j = j + 1
    return frame

def printMonth(frame):
    for i in range(42):
        content.append("%3s" % (frame[i]) + " ")
        if (i+1)%7 == 0:
            content.append('\n')

# 本地时间

import time
localtime = time.asctime( time.localtime( time.time() ) )

# 运行

def output():
    global year
    year = int(input.get())
    w = firstDay(year)
    printCalendar(year,w)
    content.append('\n')
    content.append("print time: " + localtime)

# 文件输出

def saveFile():
    output()
    file = open(str(year) + ".txt", "w")
    for i in range(len(content)):
        file.write(content[0])
        del(content[0])
    file.close()

# GUI界面

import tkinter as tk

def frame():
    root = tk.Tk()
    root.title("日历打印器 v2.0")
    # root.iconbitmap(".\\\calendar.ico")
    # root.geometry('640x360+200+200')

    lb = tk.Label(root, text="日历打印器\n请输入要打印的年份(1900年之后):", bd=20, font=(20), fg="red", bg="yellow")
    lb.grid(row=0,column=0,columnspan=2)

    global input 
    input = tk.StringVar()
    et = tk.Entry(root, textvariable = input)
    et.grid(row=1,column=0,columnspan=2)

    bt = tk.Button(root, text = "保存到当前目录", command = saveFile)
    bt.grid(row=2,column=0)

    quit = tk.Button(root, text = "退出", command = root.quit)
    quit.grid(row=2,column=1)

    root.mainloop()

frame()
v3.0源代码(用内置calendar模块简化代码,拓展到1900之前可用,GUI调整):
# 日历打印器 v3.0
# calendar printer v3.0

import calendar
from tkinter.constants import CENTER, GROOVE

# 本地时间

import time
localtime = time.strftime("%Z %Y-%m-%d %A %H:%M:%S", time.localtime())

# 文件输出

def saveFile():
    year = int(input.get())
    file = open(str(year) + ".txt", "w")
    file.write(calendar.calendar(year,w=3,l=1,c=6) + '\n')
    file.write('print time: ' + localtime)
    file.close()
    mb.showinfo('提示','输出成功!',icon = mb.INFO)

# GUI界面

import tkinter as tk
from tkinter import Frame, messagebox as mb

def gui(root):
    fr = Frame(root, relief=GROOVE)
    fr.place(relx=0.5, rely=0.5, anchor=CENTER)

    lb = tk.Label(fr, text="日历打印器\n请输入要打印的年份:", bd=20, font=(20), fg="red", bg="yellow")
    lb.grid(row=0,column=0,columnspan=2)

    global input
    input = tk.StringVar()
    input.set(time.strftime('%Y'))
    et = tk.Entry(fr, textvariable = input)
    et.grid(row=1,column=0,columnspan=2)

    bt = tk.Button(fr, text = "保存到当前目录", command = saveFile)
    bt.grid(row=3,column=0)

    quit = tk.Button(fr, text = "退出", command = root.quit)
    quit.grid(row=3,column=1)

def main():
    root = tk.Tk()
    root.title("日历打印器 v3.0")
    # root.iconbitmap(".\\\calendar.ico")
    root.geometry('320x180+200+200')
    gui(root)
    root.mainloop()

main()
v3.1源代码(加入异常处理,完善程序结构):
# 日历打印器 v3.0
# calendar printer v3.0

# 本地时间

import time

def getTime():
    localtime = time.strftime("%Z %Y-%m-%d %A %H:%M:%S", time.localtime())
    return localtime

# 文件输出

import calendar

def saveFile():
    try:
        if type(eval(et.get())) == int:
            year = int(et.get())
            file = open(str(year) + ".txt", "w")
            file.write(calendar.calendar(year,w=3,l=1,c=6) + '\n')
            printTime = getTime()
            file.write(u'打印时间:' + printTime)
            file.close()
            mb.showinfo('提示','输出成功!',icon = mb.INFO)
    except:
        et.delete(0,'end')
        mb.showerror('提示','请正确输入!',icon = mb.ERROR)

# GUI界面

import tkinter as tk
from tkinter import messagebox as mb

def gui(root):
    fr = tk.Frame(root, relief='groove')
    fr.place(relx=0.5, rely=0.5, anchor='center')

    lb = tk.Label(fr, text = "日历打印器\n\n请输入要打印的年份:", bd=20, font=(20), fg="red", bg="yellow")
    lb.grid(row=0,column=0,columnspan=2)

    global et
    et = tk.Entry(fr)
    et.insert(0,time.strftime('%Y'))
    et.grid(row=1,column=0,columnspan=2)

    bt = tk.Button(fr, text = "保存到当前目录", command = saveFile)
    bt.grid(row=3,column=0)

    quit = tk.Button(fr, text = "退出", command = root.quit)
    quit.grid(row=3,column=1)

def main():
    root = tk.Tk()
    root.title("日历打印器 v3.0")
    # root.iconbitmap(".\\\calendar.ico")
    root.geometry('320x180+200+200')
    gui(root)
    root.mainloop()

main()
编译:
  • pyinstaller -F calendar_v1.0.py方式打包生成exe(7.52M)。
  • pyinstaller -F calendar_v2.0.py方式打包生成exe(10.1M)。
  • pyinstaller -F -w -i calendar.ico calendar_v3.0.py方式打包生成calendar_v3.0.1.exe(10.1M)。
  • pyinstaller -F -w -i calendar.ico calendar_v3.0.py --upx-dir <DIR>方式打包生成calendar_v3.0.2.exe(8.97M)。
  • pyinstaller -F -w -i calendar.ico calendar_v3.1.py方式打包生成calendar_v3.1.1.exe(10.1M)。
  • upx calendar_v3.1.1.exe方式压缩生成calendar_v3.1.2.exe(10.0M)。
  • pyinstaller -F -w -i calendar.ico calendar_v3.1.py --upx-dir <DIR>方式打包生成calendar_v3.1.3.exe(8.97M)。
  • exe文件:https://wwx.lanzoui.com/b01ihdbmd (52pj)
截图:

W3ZWHf.png

WJo70x.png

其他:

周数可能还能实现,农历有点困难,毕竟calendar模块是没有农历的,我自己也不懂农历。

END

点评

农历用这个模块:zhdate  发表于 2021-8-13 11:27

免费评分

参与人数 4吾爱币 +10 热心值 +4 收起 理由
will.yu + 1 + 1 能不能加一下周数和农历?
zpzwz + 1 + 1 用心讨论,共获提升!
18023999 + 1 + 1 因为热爱,源于生活。
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 马可solo 发表于 2021-7-16 22:31
本帖最后由 马可solo 于 2021-7-19 10:50 编辑

当然,用python库直接秒杀,但是这是后话了。
[Python] 纯文本查看 复制代码
import calendar
year = int(input("请输入要打印的年份:"))
print()
for i in range(12):
    month = calendar.month(year,i+1)
    print(month)

还有更简单的方法:
[Python] 纯文本查看 复制代码
import calendar
year = int(input("请输入要打印的年份:"))
print(calendar.calendar(year,w=3,l=1,c=6))
 楼主| 马可solo 发表于 2021-7-17 15:51
本帖最后由 马可solo 于 2021-7-19 18:47 编辑

关于减小打包exe的大小的方法:https://blog.csdn.net/pipisorry/article/details/50620122
利用此方法打包:
[Bash shell] 纯文本查看 复制代码
pyinstaller -F -w -i calendar.ico calendar_v3.0.py --upx-dir <DIR>

<DIR>为upx所在绝对路径
18023999 发表于 2021-7-16 15:50
jiangwz 发表于 2021-7-16 16:41
66666666
ptmaliang 发表于 2021-7-16 18:11
感谢分享
DiaChi 发表于 2021-7-16 18:33
感谢分享。。。这操作可以。
q281843250 发表于 2021-7-16 21:16
感谢分享 很需要
czji 发表于 2021-7-17 17:57
感谢分享
feihudui 发表于 2021-7-18 20:25
呵呵 就是不知道这个实用性如何
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 21:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表