让我为你详细讲解一下如何在 Python 中使用 PyQt5 库制作指针时钟显示实时时间。
1. 创建 Qt 应用程序
首先,需要导入 PyQt5 库和系统时间模块,然后创建一个 Qt 应用程序。
import sys
import datetime
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtCore import Qt, QTimer
class Clock(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 250, 250)
self.setWindowTitle('Clock')
self.timer = QTimer()
self.timer.timeout.connect(self.update)
self.timer.start(1000)
self.show()
在 initUI() 方法中,我们设置窗口的初始位置和大小,设置窗口标题,创建一个 QTimer 对象,用于定时刷新窗口,设置定时器的超时信号,最后启动定时器并显示窗口。
2. 绘制时钟表盘
接下来,需要在窗口上绘制时钟表盘。可以重写 QWidget 类的 paintEvent() 方法来完成绘制。
class Clock(QWidget):
...
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
self.drawClock(qp)
qp.end()
def drawClock(self, qp):
size = self.size()
side = min(size.width(), size.height())
qp.setRenderHint(QPainter.Antialiasing)
qp.translate(size.width() / 2, size.height() / 2)
qp.scale(side / 200, side / 200)
pen = QPen(Qt.black, 1, Qt.SolidLine)
qp.setPen(pen)
font = qp.font()
font.setPixelSize(15)
qp.setFont(font)
for i in range(60):
if (i % 5) == 0:
qp.drawLine(84, 0, 96, 0)
else:
qp.drawLine(90, 0, 96, 0)
qp.rotate(6)
我们首先获取窗口的尺寸 size 和其中的较小边 side,然后将 QPainter 坐标系统的原点移动到窗口中心,对 QPainter 进行缩放,使得绘制的图形可以适应窗口大小,设置画笔颜色、线宽和线型,设置字体大小,然后在循环中绘制刻度线,并将 QPainter 顺时针旋转 6 度,以绘制下一个刻度线,最终完成绘制时钟表盘的过程。
3. 绘制指针
接下来,需要在窗口上绘制指针,并将指针与实时时间相关联。
class Clock(QWidget):
...
def drawClock(self, qp):
self.drawHour(qp)
self.drawMinute(qp)
self.drawSecond(qp)
def drawHour(self, qp):
hour = datetime.datetime.now().hour
minute = datetime.datetime.now().minute
angle = ((hour % 12) + minute / 60.0) * 30.0
qp.save()
qp.rotate(angle)
qp.drawLine(-20, 0, 30, 0)
qp.restore()
def drawMinute(self, qp):
minute = datetime.datetime.now().minute
angle = minute * 6.0
qp.save()
qp.rotate(angle)
qp.drawLine(-30, 0, 50, 0)
qp.restore()
def drawSecond(self, qp):
second = datetime.datetime.now().second
angle = second * 6.0
qp.save()
qp.rotate(angle)
pen = QPen(Qt.red, 1, Qt.SolidLine)
qp.setPen(pen)
qp.drawLine(-35, 0, 60, 0)
qp.restore()
我们分别实现绘制时针、分针和秒针的 drawHour()、drawMinute() 和 drawSecond() 方法。在这些方法中,我们首先获取当前的小时、分钟和秒数,然后根据它们计算指针的角度,绘制指针,并将 QPainter 根据指针角度顺时针旋转。最后,我们贴上实时更新秒针颜色的代码段。
4. 完整代码示例
下面是完整的 Python 代码示例。
import sys
import datetime
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtCore import Qt, QTimer
class Clock(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 250, 250)
self.setWindowTitle('Clock')
self.timer = QTimer()
self.timer.timeout.connect(self.update)
self.timer.start(1000)
self.show()
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
self.drawClock(qp)
qp.end()
def drawClock(self, qp):
self.drawHour(qp)
self.drawMinute(qp)
self.drawSecond(qp)
size = self.size()
side = min(size.width(), size.height())
qp.setRenderHint(QPainter.Antialiasing)
qp.translate(size.width() / 2, size.height() / 2)
qp.scale(side / 200, side / 200)
pen = QPen(Qt.black, 1, Qt.SolidLine)
qp.setPen(pen)
font = qp.font()
font.setPixelSize(15)
qp.setFont(font)
for i in range(60):
if (i % 5) == 0:
qp.drawLine(84, 0, 96, 0)
else:
qp.drawLine(90, 0, 96, 0)
qp.rotate(6)
def drawHour(self, qp):
hour = datetime.datetime.now().hour
minute = datetime.datetime.now().minute
angle = ((hour % 12) + minute / 60.0) * 30.0
qp.save()
qp.rotate(angle)
qp.drawLine(-20, 0, 30, 0)
qp.restore()
def drawMinute(self, qp):
minute = datetime.datetime.now().minute
angle = minute * 6.0
qp.save()
qp.rotate(angle)
qp.drawLine(-30, 0, 50, 0)
qp.restore()
def drawSecond(self, qp):
second = datetime.datetime.now().second
angle = second * 6.0
qp.save()
qp.rotate(angle)
pen = QPen(Qt.red, 1, Qt.SolidLine)
qp.setPen(pen)
qp.drawLine(-35, 0, 60, 0)
qp.restore()
if __name__ == '__main__':
app = QApplication(sys.argv)
clock = Clock()
sys.exit(app.exec_())
运行上述代码,即可在窗口中看到指针时钟实时显示当前时间。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中利用pyqt5制作指针钟表显示实时时间(指针时钟) - Python技术站