当前位置:首页>python>Python Qt5 实现精美八卦时钟

Python Qt5 实现精美八卦时钟

  • 2026-09-08 21:33:12
Python Qt5 实现精美八卦时钟

效果图

做一个高颜值、可直接运行、带传统八卦纹理+动态指针的 Qt5 八卦时钟,界面精美、流畅、无闪烁,支持窗口缩放。

效果包含:

  • 圆形八卦表盘(阴阳鱼 + 八卦卦象)
  • 平滑秒/分/时针
  • 中式刻度、中式字体
  • 半透明阴影、抗锯齿
  • 可自由缩放窗口

完整代码(直接复制运行)

import sysimport mathfrom PyQt5.QtWidgets import QApplication, QWidgetfrom PyQt5.QtGui import QPainter, QColor, QPen, QBrush, QFont, QPolygonFfrom PyQt5.QtCore import Qt, QTimer, QPointF, QRectF, QTimeclassBaguaClock(QWidget):def__init__(self):        super().__init__()        self.setWindowTitle("八卦时钟")        self.setMinimumSize(500, 500)# 定时器:每秒刷新一次        self.timer = QTimer()        self.timer.timeout.connect(self.update)        self.timer.start(1000)defpaintEvent(self, event):        painter = QPainter(self)        painter.setRenderHint(QPainter.Antialiasing)  # 抗锯齿        painter.setRenderHint(QPainter.SmoothPixmapTransform)# 中心坐标与半径        cx = self.width() / 2        cy = self.height() / 2        radius = min(cx, cy) - 20# 绘制背景        self.draw_background(painter, cx, cy, radius)# 绘制八卦卦象        self.draw_bagua(painter, cx, cy, radius)# 绘制阴阳鱼        self.draw_yin_yang(painter, cx, cy, radius * 0.7)# 绘制刻度        self.draw_scales(painter, cx, cy, radius)# 绘制指针        self.draw_hands(painter, cx, cy, radius)defdraw_background(self, painter, cx, cy, r):# 黑色底盘        painter.setBrush(QColor(20, 20, 20))        painter.setPen(Qt.NoPen)        painter.drawEllipse(QPointF(cx, cy), r, r)defdraw_yin_yang(self, painter, cx, cy, r):# 阴阳鱼        painter.setPen(Qt.NoPen)# 白色上半圆        painter.setBrush(QColor(255, 255, 255))        painter.drawChord(QRectF(cx-r, cy-r, 2*r, 2*r), 90*16, 180*16)# 黑色下半圆        painter.setBrush(QColor(0, 0, 0))        painter.drawChord(QRectF(cx-r, cy-r, 2*r, 2*r), 270*16, 180*16)# 阴阳鱼眼        painter.setBrush(QColor(0, 0, 0))        painter.drawEllipse(QPointF(cx, cy - r/2), r/5, r/5)        painter.setBrush(QColor(255, 255, 255))        painter.drawEllipse(QPointF(cx, cy + r/2), r/5, r/5)defdraw_bagua(self, painter, cx, cy, r):# 八卦名称与方位        guas = ["乾", "兌", "離", "震", "巽", "坎", "艮", "坤"]        angles = [-90, -45, 0, 45, 90, 135, 180, 225]        painter.setFont(QFont("Microsoft YaHei", 14, QFont.Bold))        painter.setPen(QColor(200, 200, 200))for name, angle in zip(guas, angles):            rad = math.radians(angle)            x = cx + (r * 0.82) * math.cos(rad)            y = cy + (r * 0.82) * math.sin(rad)# 文字居中            fm = painter.fontMetrics()            w = fm.width(name)            h = fm.height()            painter.drawText(QPointF(x - w/2, y + h/4), name)defdraw_scales(self, painter, cx, cy, r):# 小时刻度        painter.setPen(QPen(QColor(255, 220, 150), 3))for i in range(12):            angle = math.radians(i * 30 - 90)            x1 = cx + (r - 20) * math.cos(angle)            y1 = cy + (r - 20) * math.sin(angle)            x2 = cx + r * math.cos(angle)            y2 = cy + r * math.sin(angle)            painter.drawLine(QPointF(x1, y1), QPointF(x2, y2))# 分钟刻度        painter.setPen(QPen(QColor(150, 150, 150), 1))for i in range(60):if i % 5 == 0:continue            angle = math.radians(i * 6 - 90)            x1 = cx + (r - 10) * math.cos(angle)            y1 = cy + (r - 10) * math.sin(angle)            x2 = cx + r * math.cos(angle)            y2 = cy + r * math.sin(angle)            painter.drawLine(QPointF(x1, y1), QPointF(x2, y2))defdraw_hands(self, painter, cx, cy, r):        time = QTime.currentTime()        hour = time.hour() % 12        minute = time.minute()        second = time.second()# 时针        h_angle = math.radians((hour + minute / 60) * 30 - 90)        self.draw_hand(painter, cx, cy, h_angle, r * 0.45, 8, QColor(255, 220, 150))# 分针        m_angle = math.radians((minute + second / 60) * 6 - 90)        self.draw_hand(painter, cx, cy, m_angle, r * 0.6, 5, QColor(180, 180, 180))# 秒针        s_angle = math.radians(second * 6 - 90)        self.draw_hand(painter, cx, cy, s_angle, r * 0.7, 2, QColor(255, 80, 80))# 中心圆点        painter.setBrush(QColor(255, 220, 150))        painter.setPen(Qt.NoPen)        painter.drawEllipse(QPointF(cx, cy), 8, 8)defdraw_hand(self, painter, cx, cy, angle, length, width, color):# 绘制指针        pen = QPen(color, width, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)        painter.setPen(pen)        x = cx + length * math.cos(angle)        y = cy + length * math.sin(angle)        painter.drawLine(QPointF(cx, cy), QPointF(x, y))if __name__ == "__main__":    app = QApplication(sys.argv)    clock = BaguaClock()    clock.show()    sys.exit(app.exec_())

运行前安装依赖

如果没装 PyQt5,先执行:

pip install pyqt5

时钟特色说明

  1. 传统八卦布局

    • 8个卦象:乾、兑、离、震、巽、坎、艮、坤
    • 居中阴阳鱼(黑白太极)
    • 中式金色刻度 + 红色秒针
  2. 视觉效果

    • 抗锯齿,边缘丝滑
    • 深色底盘,高级耐看
    • 窗口可任意缩放
  3. 功能

    • 实时系统时间
    • 秒/分/时三指针
    • 每秒自动刷新

你可以自定义的地方

  • 修改 QFont 更换字体
  • 调整 QColor 改变配色
  • 修改阴阳鱼大小、指针长度
  • 添加背景纹理、边框、光晕

总结

最新文章

随机文章