pyqt制作電子鐘表
pyqt制作電子鐘表

https://github.com/n0bel/PiClock
自定義表盤背景:
效果圖:
code:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class clockForm(QWidget):
def __init__(self, parent=None):
super(clockForm, self).__init__(parent)
self.setWindowTitle("Clock")
self.timer = QTimer()
# 設(shè)置窗口計(jì)時(shí)器
window_pale = QPalette()
window_pale.setBrush(self.backgroundRole(), QBrush(QPixmap("clock.png")))
self.setPalette(window_pale)
self.timer.timeout.connect(self.update)
self.timer.start(1000)
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
# 設(shè)置表盤中的文字字體
font = QFont("Times", 6)
fm = QFontMetrics(font)
fontRect = fm.boundingRect("99") # 獲取繪制字體的矩形范圍
# 分針坐標(biāo)點(diǎn)
minPoints = [QPointF(50, 25), QPointF(48, 50), QPointF(52, 50)]
# 時(shí)鐘坐標(biāo)點(diǎn)
hourPoints = [QPointF(50, 35), QPointF(48, 50), QPointF(52, 50)]
side = min(self.width(), self.height())
painter.setViewport((self.width() - side) / 2, (self.height() - side) / 2, side, side) # 始終處于窗口中心位置顯示
# 設(shè)置QPainter的坐標(biāo)系統(tǒng),無論窗體大小如何變化,
# 窗體左上坐標(biāo)為(0,0),右下坐標(biāo)為(100,100),
# 因此窗體中心坐標(biāo)為(50,50)
painter.setWindow(0, 0, 100, 100)
transform = QTransform()
# transform.reset()
# 獲取當(dāng)前時(shí)間
currentTime = QTime().currentTime()
hour = currentTime.hour() if currentTime.hour() < 12 else currentTime.hour() - 12
minite = currentTime.minute()
second = currentTime.second()
# 獲取所需旋轉(zhuǎn)角度
hour_angle = hour * 30.0 + (minite / 60.0) * 30.0
minite_angle = (minite / 60.0) * 360.0
second_angle = second * 6.0
# 時(shí)針
transform.translate(50, 50)
transform.rotate(hour_angle)
transform.translate(-50, -50)
painter.setWorldTransform(transform)
painter.setPen(Qt.NoPen)
painter.setBrush(QBrush(Qt.darkRed))
painter.drawPolygon(QPolygonF(hourPoints))
transform.reset()
# 分針
transform.translate(50, 50)
transform.rotate(minite_angle)
transform.translate(-50, -50)
painter.setWorldTransform(transform)
painter.setBrush(QBrush(Qt.darkGreen))
painter.drawPolygon(QPolygonF(minPoints))
transform.reset()
# 秒針
transform.translate(50, 50)
transform.rotate(second_angle)
transform.translate(-50, -50)
painter.setWorldTransform(transform)
painter.setPen(QPen(Qt.darkCyan, 1))
painter.drawLine(50, 50, 50, 20)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
form = clockForm()
form.show()
app.exec_()
繪制表盤,效果圖:
'''
Created on 2013-7-2
@author: badboy
Email:lucky.haiyu@gmail.com
QQ:43831266
'''
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class clockForm(QWidget):
def __init__(self,parent=None):
super(clockForm,self).__init__(parent)
self.setWindowTitle("Clock")
self.timer=QTimer()
#設(shè)置窗口計(jì)時(shí)器
self.timer.timeout.connect(self.update)
self.timer.start(1000)
def paintEvent(self,event):
painter=QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
#設(shè)置表盤中的文字字體
font=QFont("Times",6)
fm=QFontMetrics(font)
fontRect=fm.boundingRect("99")#獲取繪制字體的矩形范圍
#分針坐標(biāo)點(diǎn)
minPoints=[QPointF(50,25),
QPointF(48,50),
QPointF(52,50)]
#時(shí)鐘坐標(biāo)點(diǎn)
hourPoints=[QPointF(50,35),
QPointF(48,50),
QPointF(52,50)]
side=min(self.width(),self.height())
painter.setViewport((self.width()-side)/2,(self.height()-side)/2,
side,side)#始終處于窗口中心位置顯示
#設(shè)置QPainter的坐標(biāo)系統(tǒng),無論窗體大小如何變化,
#窗體左上坐標(biāo)為(0,0),右下坐標(biāo)為(100,100),
#因此窗體中心坐標(biāo)為(50,50)
painter.setWindow(0,0,100,100)
#繪制表盤,使用環(huán)形漸變色
niceBlue=QColor(150,150,200)
haloGrident=QRadialGradient(50,50,50,50,50)
haloGrident.setColorAt(0.0,Qt.lightGray)
haloGrident.setColorAt(0.5,Qt.darkGray)
haloGrident.setColorAt(0.9,Qt.white)
haloGrident.setColorAt(1.0,niceBlue)
painter.setBrush(haloGrident)
painter.setPen(QPen(Qt.darkGray,1))
painter.drawEllipse(0,0,100,100)
transform=QTransform()
#繪制時(shí)鐘為0的字,以及刻度
painter.setPen(QPen(Qt.black,1.5))
fontRect.moveCenter(QPoint(50,10+fontRect.height()/2))
painter.setFont(font)
painter.drawLine(50,2,50,8)#
painter.drawText(QRectF(fontRect),Qt.AlignHCenter|Qt.AlignTop,"0")
for i in range(1,12):
transform.translate(50, 50)
transform.rotate(30)
transform.translate(-50,-50)
painter.setWorldTransform(transform)
painter.drawLine(50,2,50,8)
painter.drawText(QRectF(fontRect),Qt.AlignHCenter|Qt.AlignTop,"%d" % i)
transform.reset()
#繪制分鐘刻度線
painter.setPen(QPen(Qt.blue,1))
for i in range(1,60):
transform.translate(50,50)
transform.rotate(6)
transform.translate(-50,-50)
if i%5!=0:
painter.setWorldTransform(transform)
painter.drawLine(50,2,50,5)
transform.reset()
#獲取當(dāng)前時(shí)間
currentTime=QTime().currentTime()
hour=currentTime.hour() if currentTime.hour()<12 else currentTime.hour()-12
minite=currentTime.minute()
second=currentTime.second()
#獲取所需旋轉(zhuǎn)角度
hour_angle=hour*30.0+(minite/60.0)*30.0
minite_angle=(minite/60.0)*360.0
second_angle=second*6.0
#時(shí)針
transform.translate(50,50)
transform.rotate(hour_angle)
transform.translate(-50,-50)
painter.setWorldTransform(transform)
painter.setPen(Qt.NoPen)
painter.setBrush(QBrush(Qt.darkRed))
painter.drawPolygon(QPolygonF(hourPoints))
transform.reset()
#分針
transform.translate(50,50)
transform.rotate(minite_angle)
transform.translate(-50,-50)
painter.setWorldTransform(transform)
painter.setBrush(QBrush(Qt.darkGreen))
painter.drawPolygon(QPolygonF(minPoints))
transform.reset()
#秒針
transform.translate(50,50)
transform.rotate(second_angle)
transform.translate(-50,-50)
painter.setWorldTransform(transform)
painter.setPen(QPen(Qt.darkCyan,1))
painter.drawLine(50,50,50,20)
if __name__=="__main__":
import sys
app=QApplication(sys.argv)
form=clockForm()
form.show()
app.exec_()
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。