最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python打造一個你的專屬中醫(yī)養(yǎng)生桌面時鐘

 更新時間:2026年01月21日 08:36:33   作者:幸福清風  
這篇文章主要和大家詳細介紹了一個有趣又有用的小項目,即使用 Python 編寫一個集成了公歷、農歷和中醫(yī)十二時辰養(yǎng)生提示的桌面時鐘,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下

今天想和大家分享一個有趣又有用的小項目——如何使用 Python 編寫一個集成了公歷、農歷和中醫(yī)十二時辰養(yǎng)生提示的桌面時鐘。這個項目不僅實用,還能讓我們在快節(jié)奏的生活中,偶爾抬頭看看屏幕,就能得到一份來自古老智慧的關懷。

效果展示

項目背景與靈感

隨著生活節(jié)奏的加快,越來越多的人開始關注健康和養(yǎng)生。中醫(yī)的“十二時辰養(yǎng)生法”是古人根據人體經絡氣血運行規(guī)律總結出的經驗,比如“卯時(5-7點)大腸經當令,適合起床喝水促進排毒”。將這些知識融入到一個實時更新的時鐘中,既能滿足我們查看時間的基本需求,又能隨時提醒我們順應自然規(guī)律調養(yǎng)身體,豈不是很棒?

技術實現詳解

我們的“中醫(yī)養(yǎng)生時鐘”主要依賴以下幾個 Python 庫:

  • tkinter: Python 自帶的 GUI 庫,用于構建圖形用戶界面。
  • datetime: Python 標準庫,用于獲取和格式化當前時間。
  • lunardate: 一個第三方庫,專門用來處理農歷日期轉換。需要先通過 pip install lunardate 安裝。

1. 核心類ChineseClock

整個程序圍繞 ChineseClock 類展開。它的 __init__ 方法負責初始化所有數據和 UI 組件。

數據準備

  • shichen_dict: 這是一個核心字典,存儲了十二時辰、對應的時間范圍(24小時制)以及對應的養(yǎng)生提示。鍵是一個元組 (時辰名, 時間范圍),值是提示字符串。
  • lunar_months: 一個列表,將數字月份映射為農歷月份名稱(如 ["正月", "二月", ...]),方便后續(xù)顯示。

用戶界面 (create_widgets)

我們創(chuàng)建了一個無邊框 (overrideredirect) 并始終置頂 (attributes('-topmost', True)) 的窗口,使其像一個小工具一樣常駐屏幕。

布局: 使用 tk.Frame 作為主容器 (main_frame),內部元素垂直堆疊 (pack)。

組件:

  • gregorian_label: 顯示完整的公歷年月日時分秒。
  • weekday_label: 顯示星期幾。
  • lunar_label: 顯示農歷日期。
  • shichen_label: 顯示當前時辰及其養(yǎng)生提示。
  • close_button: 一個簡潔的“×”號按鈕,放在窗口右上角,用于關閉程序。
  • 樣式: 設置了不同的字體大小、顏色和背景色,使其看起來更美觀、信息層次分明。例如,公歷時間用綠色,星期用黃色,農歷用金色,時辰提示用紅色。

功能函數

  • get_lunar_date(): 調用 LunarDate.fromSolarDate 獲取今天的農歷日期對象。然后處理月份(包括閏月)和日期(通過 number_to_chinese 函數將數字轉換為“初一”、“初二”等)的格式化,最終返回如“農歷:二零二六年正月初一”的字符串。
  • get_shichen(): 獲取當前小時 (datetime.now().hour),遍歷 shichen_dict,判斷當前小時落在哪個時辰范圍內。特別注意處理跨天的“子時”(23:00-01:00)。找到后返回格式化的提示信息,如“子時(23:00-01:00)· 膽經運行,及時入睡養(yǎng)陽氣”。
  • update_time(): 這是驅動時鐘的核心函數。它:
    • 獲取當前時間 (now)。
    • 更新公歷、星期、農歷標簽的文本。
    • 調用 get_shichen 更新時辰提示。
    • 使用 self.root.after(1000, self.update_time) 遞歸調用自身,實現每秒刷新一次顯示。

可拖動窗口 (bind_drag_events,start_drag,on_drag)

為了讓時鐘可以隨意移動到屏幕的任意位置,我們實現了窗口拖動功能。

  • 我們?yōu)?main_frame 內的所有子組件(除了 close_button)以及 root 窗口本身綁定了鼠標事件 <ButtonPress-1><B1-Motion>
  • start_drag: 記錄鼠標按下的初始坐標(相對于被點擊組件的位置)。
  • on_drag: 當鼠標拖動時,計算窗口的新位置(winfo_x + 鼠標移動的偏移量),并用 geometry 方法更新窗口位置。
  • 通過檢查 event.widget 是否為 close_button,我們確保在關閉按鈕上按住時不會觸發(fā)拖動,保證按鈕功能正常。

2. 程序入口

if __name__ == "__main__": 語句塊創(chuàng)建 ChineseClock 實例,并啟動 Tkinter 的事件循環(huán) mainloop(),程序開始運行并等待用戶交互。

完整代碼

import tkinter as tk
from datetime import datetime
from lunardate import LunarDate


class ChineseClock:
    def __init__(self):
        # 時辰養(yǎng)生提示字典
        self.shichen_dict = {
            ("子時", "23:00-01:00"): "膽經運行,及時入睡養(yǎng)陽氣",
            ("丑時", "01:00-03:00"): "肝經運行,深度睡眠助排毒",
            ("寅時", "03:00-05:00"): "肺經運行,保持溫暖忌寒涼",
            ("卯時", "05:00-07:00"): "大腸經運行,起床飲水促排毒",
            ("辰時", "07:00-09:00"): "胃經運行,營養(yǎng)早餐要溫食",
            ("巳時", "09:00-11:00"): "脾經運行,適當活動助運化",
            ("午時", "11:00-13:00"): "心經運行,小憩養(yǎng)神忌過勞",
            ("未時", "13:00-15:00"): "小腸經運行,補充水分助吸收",
            ("申時", "15:00-17:00"): "膀胱經運行,多喝溫水促代謝",
            ("酉時", "17:00-19:00"): "腎經運行,少鹽飲食護腎氣",
            ("戌時", "19:00-21:00"): "心包經運行,放松心情宜休閑",
            ("亥時", "21:00-23:00"): "三焦經運行,準備入睡排煩惱"
        }

        # 農歷月份轉換
        self.lunar_months = ["正月", "二月", "三月", "四月", "五月", "六月",
                             "七月", "八月", "九月", "十月", "冬月", "臘月"]

        # 創(chuàng)建主窗口
        self.root = tk.Tk()
        self.root.title("中醫(yī)養(yǎng)生時鐘")
        self.root.attributes('-topmost', True)
        self.root.overrideredirect(True)  # 無邊框窗口
        self.root.config(bg='black')

        # 拖動相關變量
        self._drag_start_x = 0
        self._drag_start_y = 0

        # 創(chuàng)建界面組件
        self.create_widgets()

        # 綁定拖動事件
        self.bind_drag_events()

        # 初始位置
        self.set_initial_position()

        # 啟動時間更新
        self.update_time()

    def close_window(self):
        """關閉窗口的方法"""
        print("正在關閉時鐘...")
        self.root.destroy()

    def bind_drag_events(self):
        """
        為窗口主體內容綁定拖動事件。
        避免對關閉按鈕等特定組件綁定拖動事件,以確保它們能被正常點擊。
        """
        # 對于 main_frame 內的每個子組件
        for child in self.main_frame.winfo_children():
            # 如果不是關閉按鈕,則綁定拖動事件
            if child != self.close_button:
                child.bind("<ButtonPress-1>", self.start_drag)
                child.bind("<B1-Motion>", self.on_drag)

        # 主窗口本身也可以拖動(只要不在關閉按鈕上按下的情況下)
        self.root.bind("<ButtonPress-1>", self.start_drag)
        self.root.bind("<B1-Motion>", self.on_drag)

    def start_drag(self, event):
        """記錄拖動起始位置,但排除在關閉按鈕上的操作"""
        # 檢查事件是否發(fā)生在關閉按鈕上
        if str(event.widget) == str(self.close_button):
            # 如果在關閉按鈕上按下,則不進行任何拖動相關的操作
            return
        # 否則,記錄拖動的初始相對位置(相對于被點擊的widget)
        self._drag_start_x = event.x
        self._drag_start_y = event.y

    def on_drag(self, event):
        """處理拖動事件"""
        x = self.root.winfo_x() + (event.x - self._drag_start_x)
        y = self.root.winfo_y() + (event.y - self._drag_start_y)
        self.root.geometry(f"+{x}+{y}")

    def set_initial_position(self):
        """設置初始位置在右上角"""
        screen_width = self.root.winfo_screenwidth()
        self.root.geometry(f"+{screen_width - 600}+20")

    def create_widgets(self):
        """創(chuàng)建界面組件"""
        # 字體配置
        time_font = ('微軟雅黑', 26, 'bold')  # 公歷時間
        weekday_font = ('微軟雅黑', 22, 'bold')  # 星期
        lunar_font = ('微軟雅黑', 18)  # 農歷
        shichen_font = ('微軟雅黑', 16)  # 時辰提示

        # 創(chuàng)建一個Frame來容納主要內容
        self.main_frame = tk.Frame(self.root, bg='black')
        self.main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        # 關閉按鈕 - 優(yōu)化版
        # 使用較小的尺寸,避免遮擋文本
        self.close_button = tk.Button(
            self.root,
            text="×",
            command=self.close_window,
            font=('Arial', 6, 'bold'),  # 更清晰的字體
            fg='white',
            bg='red',
            bd=0,
            width=1,
            height=1,
            relief='flat'  # 去除按鈕立體感
        )
        # 精確放置:x=-15, y=10 使按鈕更靠近右上角,且不遮擋時間
        self.close_button.place(relx=1.0, rely=0.0, anchor='ne', x=-2, y=2)

        # 公歷時間標簽
        self.gregorian_label = tk.Label(
            self.main_frame,
            font=time_font,
            fg='#00FF00',  # 綠色
            bg='black'
        )
        self.gregorian_label.pack(pady=(0, 5))

        # 星期標簽
        self.weekday_label = tk.Label(
            self.main_frame,
            font=weekday_font,
            fg='#FFFF00',  # 黃色
            bg='black'
        )
        self.weekday_label.pack(pady=(0, 10))

        # 農歷時間標簽
        self.lunar_label = tk.Label(
            self.main_frame,
            font=lunar_font,
            fg='#FFD700',  # 金色
            bg='black'
        )
        self.lunar_label.pack(pady=(0, 10))

        # 時辰提示標簽
        self.shichen_label = tk.Label(
            self.main_frame,
            font=shichen_font,
            fg='#FF6347',  # 深紅
            bg='black',
            wraplength=400,  # 文本自動換行
            justify='center'  # 居中對齊
        )
        self.shichen_label.pack(pady=(0, 10))

        # 添加底部裝飾線(可選)
        separator = tk.Frame(self.main_frame, height=2, bg='#333333', width=400)
        separator.pack(pady=(0, 5))

    def get_shichen(self):
        """獲取當前時辰及提示"""
        current_hour = datetime.now().hour
        for (name, time_range), tip in self.shichen_dict.items():
            start = int(time_range.split("-")[0].split(":")[0])
            end = int(time_range.split("-")[1].split(":")[0])
            # 處理跨天時辰(子時)
            if start > end:
                if current_hour >= start or current_hour < end:
                    return f"{name}({time_range})· {tip}"
            elif start <= current_hour < end:
                return f"{name}({time_range})· {tip}"
        return ""

    def get_lunar_date(self):
        """獲取格式化農歷日期"""
        now = datetime.now()
        lunar_date = LunarDate.fromSolarDate(now.year, now.month, now.day)

        # 轉換月份
        month_str = self.lunar_months[lunar_date.month - 1]
        if lunar_date.isLeapMonth:
            month_str = "閏" + month_str

        # 轉換日期
        day_str = self.number_to_chinese(lunar_date.day)

        return f"農歷:{lunar_date.year}年{month_str}{day_str}"

    def number_to_chinese(self, num):
        """數字轉中文日期(1-30)"""
        chinese_days = ["初一", "初二", "初三", "初四", "初五",
                        "初六", "初七", "初八", "初九", "初十",
                        "十一", "十二", "十三", "十四", "十五",
                        "十六", "十七", "十八", "十九", "二十",
                        "廿一", "廿二", "廿三", "廿四", "廿五",
                        "廿六", "廿七", "廿八", "廿九", "三十"]
        return chinese_days[num - 1]

    def update_time(self):
        """更新時間顯示"""
        now = datetime.now()

        # 公歷時間
        gregorian_text = now.strftime(f"北京時間:%Y-%m-%d %H:%M:%S")
        self.gregorian_label.config(text=gregorian_text)

        # 星期
        weekdays_zh = ["星期一", "星期二", "星期三",
                       "星期四", "星期五", "星期六", "星期日"]
        weekday_str = weekdays_zh[now.weekday()]
        self.weekday_label.config(text=weekday_str)

        # 農歷時間
        self.lunar_label.config(text=self.get_lunar_date())

        # 時辰提示
        self.shichen_label.config(text=self.get_shichen())

        # 每秒更新
        self.root.after(1000, self.update_time)


if __name__ == "__main__":
    clock = ChineseClock()
    clock.root.mainloop()

到此這篇關于基于Python打造一個你的專屬中醫(yī)養(yǎng)生桌面時鐘的文章就介紹到這了,更多相關Python桌面時鐘內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • pycharm實現設置自動的參數注釋標識

    pycharm實現設置自動的參數注釋標識

    這篇文章主要介紹了pycharm實現設置自動的參數注釋標識,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 解析目標檢測之IoU

    解析目標檢測之IoU

    Intersection over Union(IoU)是一種測量在特定數據集中檢測相應物體準確度的一個標準。IoU是一個簡單的測量標準,只要是在輸出中得出一個預測范圍(bounding boxes)的任務都可以用IoU來進行測量
    2021-06-06
  • python-pymongo常用查詢方法含聚合問題

    python-pymongo常用查詢方法含聚合問題

    這篇文章主要介紹了python-pymongo常用查詢方法含聚合問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • caffe的python接口繪制loss和accuracy曲線

    caffe的python接口繪制loss和accuracy曲線

    這篇文章主要為大家介紹了caffe的python接口繪制loss和accuracy曲線示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • opencv實現圖片模糊和銳化操作

    opencv實現圖片模糊和銳化操作

    這篇文章主要為大家詳細介紹了opencv實現圖片模糊和銳化操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Python的pdfplumber庫將pdf轉為圖片的實現

    Python的pdfplumber庫將pdf轉為圖片的實現

    本文主要介紹了Python的pdfplumber庫將pdf轉為圖片的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 基于Python預測一下世界杯最后贏家

    基于Python預測一下世界杯最后贏家

    四年一度的世界杯已經開始了,對于不少熱愛足球運動的球迷來說,這可是十分難得的盛宴。今天小編就通過Python數據分析以及機器學習等方式來預測一下誰能獲得最后的冠軍,感興趣的可以了解一下
    2022-11-11
  • python調用sikulixide庫實現自動化腳本方法實例

    python調用sikulixide庫實現自動化腳本方法實例

    SikuliX IDE是一個基于圖像識別的自動化測試工具,主要用于UI測試,它本身并不直接支持文本文件讀取操作,因為它主要用于處理屏幕上的圖片和截圖,這篇文章主要介紹了python調用sikulixide庫實現自動化腳本的相關資料,需要的朋友可以參考下
    2025-11-11
  • Python網絡通訊之TCP協議實現服務器和客戶端實例

    Python網絡通訊之TCP協議實現服務器和客戶端實例

    這篇文章主要介紹了Python網絡通訊之TCP協議實現服務器和客戶端實例, socket編程一種獨立于協議的網絡編程接口,應用程序可以通過它發(fā)送或接收數據,可對其進行像對文件一樣的打開、讀寫和關閉等操作,需要的朋友可以參考下
    2023-08-08
  • Python實現一鍵摳圖的示例代碼

    Python實現一鍵摳圖的示例代碼

    在日常的工作和生活中,我們經常會遇到需要摳圖的場景,即便是只有一張圖片需要摳,也會摳得我們不耐煩。本文將為大家分享一個Python實現一鍵摳圖的示例代碼,需要的可以參考一下
    2022-08-08

最新評論

苏尼特右旗| 东阿县| 霍州市| 麻江县| 玛纳斯县| 井陉县| 澎湖县| 丘北县| 怀宁县| 当涂县| 灵川县| 阳春市| 周至县| 仪征市| 江达县| 绿春县| 满城县| 镇雄县| 讷河市| 汝州市| 汉中市| 安西县| 准格尔旗| 资中县| 衢州市| 文昌市| 镇平县| 阳春市| 尉氏县| 确山县| 宁蒗| 陆丰市| 维西| 梅河口市| 改则县| 个旧市| 屏南县| 蓬溪县| 灵川县| 大英县| 休宁县|