PyQt實現鐘表效果
注意:本程序在Python3.3+PyQt5測試通過
主要目的是為了鍛煉使用Qt繪圖的相關知識'''
Created on 2013-7-2
@author: badboy
Email:lucky.haiyu@gmail.com<script cf-hash="f9e31" type="text/javascript">
/ <![CDATA[ /!function(){try{var t="currentScript"in document?document.currentScript:function(){for(var t=document.getElementsByTagName("script"),e=t.length;e--;)if(t[e].getAttribute("cf-hash"))return t[e]}();if(t&&t.previousSibling){var e,r,n,i,c=t.previousSibling,a=c.getAttribute("data-cfemail");if(a){for(e="",r=parseInt(a.substr(0,2),16),n=2;a.length-n;n+=2)i=parseInt(a.substr(n,2),16)^r,e+=String.fromCharCode(i);e=document.createTextNode(e),c.parentNode.replaceChild(e,c)}}}catch(u){}}();/ ]]> /</script>
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()
#設置窗口計時器
self.timer.timeout.connect(self.update)
self.timer.start(1000)
def paintEvent(self,event):
painter=QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
#設置表盤中的文字字體
font=QFont("Times",6)
fm=QFontMetrics(font)
fontRect=fm.boundingRect("99")#獲取繪制字體的矩形范圍
#分針坐標點
minPoints=[QPointF(50,25),
QPointF(48,50),
QPointF(52,50)]
#時鐘坐標點
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)#始終處于窗口中心位置顯示
#設置QPainter的坐標系統,無論窗體大小如何變化,
#窗體左上坐標為(0,0),右下坐標為(100,100),
#因此窗體中心坐標為(50,50)
painter.setWindow(0,0,100,100)
#繪制表盤,使用環形漸變色
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()
#繪制時鐘為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()
#獲取當前時間
currentTime=QTime().currentTime()
hour=currentTime.hour() if currentTime.hour()<12 else currentTime.hour()-12
minite=currentTime.minute()
second=currentTime.second()
#獲取所需旋轉角度
hour_angle=hour*30.0+(minite/60.0)*30.0
minite_angle=(minite/60.0)*360.0
second_angle=second*6.0
#時針
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_()</pre>
本文由用戶 ybw8 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!