125
社区成员




一 电子时钟:时:分:秒
下面是使用PyQt实现时钟的示例代码:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel
from PyQt5.QtCore import Qt, QTimer, QTime
class Clock(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
vbox = QVBoxLayout()
self.timeLabel = QLabel(self)
self.timeLabel.setAlignment(Qt.AlignCenter)
vbox.addWidget(self.timeLabel)
self.setLayout(vbox)
timer = QTimer(self)
timer.timeout.connect(self.showTime)
timer.start(1000)
self.showTime()
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Clock')
self.show()
def showTime(self):
time = QTime.currentTime()
text = time.toString('hh:mm:ss')
self.timeLabel.setText(text)
if __name__ == '__main__':
app = QApplication(sys.argv)
clock = Clock()
sys.exit(app.exec_())
这个示例代码中,我们创建了一个名为Clock
的窗口类,该类继承自QWidget
。
在Clock
类中,我们创建了一个QVBoxLayout
垂直布局,并在其中添加了一个QLabel
标签。
我们还使用QTimer
定时器来更新时钟的时间,并在每次更新时调用showTime
方法,该方法将当前时间转换为指定格式的字符串,并将其设置为QLabel
的文本内容。
在主函数中,我们创建了一个QApplication
实例,并实例化了Clock
类的对象,然后调用app.exec_()
方法运行应用程序。
二 图形时钟
下面是使用PyQt实现带有时针、分针和秒针的圆形时钟的示例代码:
import sys
import math
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QBrush, QPen, QColor
from PyQt5.QtCore import Qt, QTimer, QPoint, QRectF, QTime
class Clock(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
timer = QTimer(self)
timer.timeout.connect(self.update)
timer.start(1000)
self.setGeometry(300, 300, 250, 250)
self.setWindowTitle('Clock')
self.show()
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
side = min(self.width(), self.height())
painter.setViewport((self.width() - side) // 2, (self.height() - side) // 2, side, side)
painter.setWindow(-50, -50, 100, 100)
# 绘制表盘
brush = QBrush(QColor(255, 255, 255))
painter.setBrush(brush)
pen = QPen(QColor(0, 0, 0))
pen.setWidth(2)
painter.setPen(pen)
painter.drawEllipse(-45, -45, 90, 90)
# 绘制刻度
for i in range(60):
angle = math.pi * 2 / 60 * i
inner_radius = 40 if i % 5 == 0 else 42
outer_radius = 45
x1 = int(math.sin(angle) * inner_radius)
y1 = int(-math.cos(angle) * inner_radius)
x2 = int(math.sin(angle) * outer_radius)
y2 = int(-math.cos(angle) * outer_radius)
painter.drawLine(QPoint(x1, y1), QPoint(x2, y2))
# 获取当前时间并计算指针的位置
time = QTime.currentTime()
hour = time.hour()
minute = time.minute()
second = time.second()
hour_angle = (hour % 12 + minute / 60) * 30
minute_angle = minute * 6
second_angle = second * 6
# 绘制时针
painter.save()
painter.rotate(hour_angle)
pen.setWidth(4)
painter.setPen(pen)
painter.drawLine(0, 0, 0, -20)
painter.restore()
# 绘制分针
painter.save()
painter.rotate(minute_angle)
pen.setWidth(3)
painter.setPen(pen)
painter.drawLine(0, 0, 0, -30)
painter.restore()
# 绘制秒针
painter.save()
painter.rotate(second_angle)
pen.setWidth(2)
painter.setPen(pen)
painter.drawLine(0, 0, 0, -40)
painter.restore()
if __name__ == '__main__':
app = QApplication(sys.argv)
clock = Clock()
sys.exit(app.exec_())
在这个示例代码中,我们创建了一个名为Clock
的窗口类,该类继承自QWidget
。
在Clock
类中,我们使用QTimer
定时器来更新时钟的时间,并在每次更新时调用paintEvent
方法,该方法绘制了一个圆形表盘和三个指针。
在paintEvent
方法中,我们首先设置了绘图器的视口和窗口,以确保表盘的大小适合窗口大小。
然后,我们使用QPainter
绘制了表盘和刻度。
接下来,我们获取当前时间并计算时针、分针和秒针的角度,然后使用QPainter
绘制三个指针。
在每个指针的绘制过程中,我们使用painter.save()
和painter.restore()
方法保存和还原绘图器的状态,以确保不会影响到其他元素。
当我们运行这个代码时,将会看到一个带有时针、分针和秒针的圆形时钟。
pyQt 实现相对比C++ 的实现要简便很多,如果要翻译成C++版本的也很简单,大家可以试试。