1、简单的日历
需求分析
简单的日历:1)图形化显示日历,实时显示当前时间。2)列表选择年份与月份,点解显示时间显示本月得日历,和对应阴历。
实现
import tkinter as tk # 导入tkinter库用于创建GUI
from datetime import datetime # 导入datetime模块用于获取当前时间
import calendar # 导入calendar模块用于处理日历
from zhdate import ZhDate # 导入zhdate库用于处理阴历日期
class CalendarApp:
def __init__(self, root):
self.root = root # 保存主窗口对象
self.root.title("日历") # 设置窗口标题
self.root.geometry("600x600") # 设置窗口大小
# 当前时间显示
self.time_label = tk.Label(root, font=("Arial", 18)) # 创建标签显示当前时间
self.time_label.pack(pady=28) # 将标签添加到窗口并设置上下间距
# 年份选择
self.year_label = tk.Label(root, text="选择年份:", font=(14)) # 创建年份选择标签
self.year_label.pack(pady=8) # 将标签添加到窗口
self.year_var = tk.IntVar(value=datetime.now().year) # 创建整数变量,默认值为当前年份
self.year_spinbox = tk.Spinbox(root, from_=1900, to=2100, textvariable=self.year_var, width=10) # 创建年份选择框
self.year_spinbox.pack(pady=3) # 将选择框添加到窗口
# 月份选择
self.month_label = tk.Label(root, text="选择月份:", font=(14)) # 创建月份选择标签
self.month_label.pack(pady=8) # 将标签添加到窗口
self.month_var = tk.IntVar(value=datetime.now().month) # 创建整数变量,默认值为当前月份
self.month_spinbox = tk.Spinbox(root, from_=1, to=12, textvariable=self.month_var, width=10) # 创建月份选择框
self.month_spinbox.pack(pady=3) # 将选择框添加到窗口
# 显示日历按钮
self.show_button = tk.Button(root, text="显示日历", command=self.show_calendar) # 创建按钮,点击时调用show_calendar方法
self.show_button.pack(pady=10) # 将按钮添加到窗口并设置上下间距
# 日历显示区域
self.calendar_text = tk.Text(root, height=18, width=40, state="disabled") # 创建文本区域用于显示日历
self.calendar_text.pack(pady=10) # 将文本区域添加到窗口
# 实时更新时间
self.update_time() # 调用更新时间方法
def update_time(self):
"""更新当前时间"""
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 获取当前时间并格式化
self.time_label.config(text=f"当前时间: {now}") # 更新时间标签的文本
self.root.after(1000, self.update_time) # 每秒调用一次update_time方法
def show_calendar(self):
"""显示选择的年月日历"""
year = self.year_var.get() # 获取选择的年份
month = self.month_var.get() # 获取选择的月份
# 清空日历显示区域
self.calendar_text.config(state="normal") # 设置文本区域为可编辑状态
self.calendar_text.delete(1.0, tk.END) # 清空文本区域内容
# 显示阳历
cal = calendar.month(year, month) # 获取指定年月的阳历
self.calendar_text.insert(tk.END, f"阳历 {year}年{month}月:\n") # 插入阳历标题
self.calendar_text.insert(tk.END, cal + "\n") # 插入阳历内容
# 显示阴历
self.calendar_text.insert(tk.END, f"阴历 {year}年{month}月:\n") # 插入阴历标题
for day in range(1, calendar.monthrange(year, month)[1] + 1): # 遍历该月的每一天
lunar_date = ZhDate.from_datetime(datetime(year, month, day)) # 转换为阴历
self.calendar_text.insert(tk.END, f"初{day}: {lunar_date}\n") # 插入阴历日期
self.calendar_text.config(state="disabled") # 设置文本区域为只读状态
if __name__ == "__main__":
root = tk.Tk() # 创建主窗口
app = CalendarApp(root) # 创建日历应用实例
root.mainloop() # 进入主循环
测试:
unittest
import unittest
from datetime import datetime
from zhdate import ZhDate
import calendar
class TestCalendarApp(unittest.TestCase):
def test_lunar_conversion(self):
"""测试阳历转换为阴历"""
year = 2023
month = 1
for day in range(1, calendar.monthrange(year, month)[1] + 1):
lunar_date = ZhDate.from_datetime(datetime(year, month, day))
self.assertIsInstance(lunar_date, ZhDate)
def test_leap_year(self):
"""测试闰年2月的天数"""
year = 2020 # 闰年
month = 2
self.assertEqual(calendar.monthrange(year, month)[1], 29)
year = 2021 # 平年
self.assertEqual(calendar.monthrange(year, month)[1], 28)
if __name__ == "__main__":
unittest.main()
pytest
import pytest
from datetime import datetime
from zhdate import ZhDate
import calendar
def test_lunar_conversion():
"""测试阳历转换为阴历"""
year = 2023
month = 1
for day in range(1, calendar.monthrange(year, month)[1] + 1):
lunar_date = ZhDate.from_datetime(datetime(year, month, day))
assert isinstance(lunar_date, ZhDate)
def test_leap_year():
"""测试闰年2月的天数"""
year = 2020 # 闰年
month = 2
assert calendar.monthrange(year, month)[1] == 29
year = 2021 # 平年
assert calendar.monthrange(year, month)[1] == 28
2、随机名片生成器
生成随机的名片信息,包括姓名、电话和地址
1、使用faker
Faker(第三方库,用于生成伪造数据。它可以帮助开发者在测试、数据分析、演示等场景中快速生成各种类型的数据,如姓名、地址、邮箱、电话号码、信用卡信息等)
import random
from faker import Faker
class BusinessCardGenerator:
def __init__(self):
self.fake = Faker('zh_CN')
def generate_card(self):
"""生成随机名片信息"""
name = self.fake.name() # 随机姓名
phone = self.generate_phone() # 随机电话
address = self.fake.address().replace("\n", ", ") # 随机地址
return {
"姓名": name,
"电话": phone,
"地址": address
}
def generate_phone(self):
"""生成随机电话"""
# 这里假设电话号码格式为 123-4567-8901
return f"{random.randint(100, 999)}-{random.randint(1000, 9999)}-{random.randint(1000, 9999)}"
def main():
generator = BusinessCardGenerator()
num_cards = int(input("请输入要生成的名片数量:"))
for _ in range(num_cards):
card = generator.generate_card()
print("\n名片信息:")
for key, value in card.items():
print(f"{key}: {value}")
if __name__ == "__main__":
main()
2、random
import random
class BusinessCardGenerator:
def __init__(self):
self.names = ["张三", "李四", "liu MR", "zhao MRS", "周一"]
self.addresses = [
"北京",
"上海",
"广州",
"深圳",
"杭州"
]
def generate_name(self):
"""随机生成姓名"""
return random.choice(self.names)
def generate_phone(self):
"""生成随机电话"""
return f"1{random.randint(3, 9)}{random.randint(10000000, 99999999)}"
def generate_address(self):
"""随机生成地址"""
return random.choice(self.addresses)
def generate_business_card(self):
"""生成名片信息"""
name = self.generate_name()
phone = self.generate_phone()
address = self.generate_address()
return f"姓名: {name}\n电话: {phone}\n地址: {address}"
if __name__ == "__main__":
generator = BusinessCardGenerator()
print(generator.generate_business_card())
测试
unittest
import unittest
from file_generate import BusinessCardGenerator
class TestBusinessCardGenerator(unittest.TestCase):
def setUp(self):
"""测试前的准备工作"""
self.generator = BusinessCardGenerator()
def test_generate_name(self):
"""测试随机生成姓名"""
name = self.generator.generate_name()
self.assertIn(name, self.generator.names) # 检查生成的姓名是否在预定义的姓名列表中
def test_generate_phone(self):
"""测试生成随机电话"""
phone = self.generator.generate_phone()
self.assertTrue(phone.startswith("1")) # 检查电话是否以1开头
self.assertEqual(len(phone), 11) # 检查电话长度是否为11位
def test_generate_address(self):
"""测试随机生成地址"""
address = self.generator.generate_address()
self.assertIn(address, self.generator.addresses) # 检查生成的地址是否在预定义的地址列表中
def test_generate_business_card(self):
"""测试生成名片信息"""
card = self.generator.generate_business_card()
self.assertIn("姓名:", card) # 检查名片中是否包含姓名
self.assertIn("电话:", card) # 检查名片中是否包含电话
self.assertIn("地址:", card) # 检查名片中是否包含地址
if __name__ == "__main__":
unittest.main()
pytest
import pytest
from file_generate import BusinessCardGenerator
@pytest.fixture
def business_card_generator():
"""Fixture for BusinessCardGenerator"""
return BusinessCardGenerator()
def test_generate_name(business_card_generator):
"""测试随机生成姓名"""
name = business_card_generator.generate_name()
assert name in business_card_generator.names # 检查生成的姓名是否在预定义的姓名列表中
def test_generate_phone(business_card_generator):
"""测试生成随机电话"""
phone = business_card_generator.generate_phone()
assert phone.startswith("1") # 检查电话是否以1开头
assert len(phone) == 11 # 检查电话长度是否为11位
def test_generate_address(business_card_generator):
"""测试随机生成地址"""
address = business_card_generator.generate_address()
assert address in business_card_generator.addresses # 检查生成的地址是否在预定义的地址列表中
def test_generate_business_card(business_card_generator):
"""测试生成名片信息"""
card = business_card_generator.generate_business_card()
assert "姓名:" in card # 检查名片中是否包含姓名
assert "电话:" in card # 检查名片中是否包含电话
assert "地址:" in card # 检查名片中是否包含地址