python小项目编程-初级(3、简单的日历,4、名片随机生成)

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  # 检查名片中是否包含地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值