您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Python編程如何使用PyQt5制作動(dòng)態(tài)鐘表”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
環(huán)境配置
實(shí)現(xiàn)思路
老式鐘表制作
電子表制作
合并兩表界面
核心代碼
實(shí)現(xiàn)思路分為大致分為三個(gè)部分:老式鐘表制作、電子表制作、兩表合并為一個(gè)界面
整體來(lái)看老式鐘表界面,有以下幾種圖案:時(shí)針、分針、秒針、1-12小時(shí)刻度、每格小刻度、每5格一大刻度
在鐘表運(yùn)行時(shí),時(shí)針、分針、秒針 隨時(shí)間變化以界面中心為圓點(diǎn)逆時(shí)針旋轉(zhuǎn)一定的角度,這個(gè)角度可以計(jì)算出來(lái)的
為了方便,整個(gè)界面效果我用 PyQt5 中的 QPainter 控件來(lái)實(shí)現(xiàn),這個(gè)控件其實(shí)就是一個(gè)繪制器,用來(lái)繪制界面上的元素
時(shí)鐘運(yùn)行軌跡其實(shí)就是把每一秒的畫面拼接在一起,最后組成一個(gè)連貫的時(shí)間序列圖像,因此重寫了 paintEvent 函數(shù),繪制每一秒實(shí)時(shí)圖像;
def paintEvent(self, event): hour_points = [QPoint(5,8),QPoint(-5,8),QPoint(0,-30)] minute_points = [QPoint(5,8),QPoint(-5,8),QPoint(0,-65)] second_points = [QPoint(5,8),QPoint(-5,8),QPoint(0,-80)] hour_color = QColor(200,100,0,200) minute_color = QColor(0,127,127,150) second_color = QColor(0,160,230,150) min_len = min(self.width(),self.height()) time = QTime.currentTime() #獲取當(dāng)前時(shí)間 painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.translate(self.width()/2,self.height()/2)#平移到窗口中心 painter.scale(min_len/200.0,min_len/200.0) #進(jìn)行尺度縮放 #----------繪制時(shí)針------------ painter.setPen(Qt.NoPen) painter.setBrush(hour_color)#顏色 painter.save() # 根據(jù) 1小時(shí)時(shí)= 30°,水品方向逆時(shí)針旋轉(zhuǎn)時(shí)針 painter.rotate(30.0*((time.hour()+time.minute()/60.0))) painter.drawConvexPolygon(QPolygon(hour_points)) painter.restore() # save 退出,可重新設(shè)置畫筆 painter.setPen(hour_color) #繪制小時(shí)線(360/12 = 30度) for i in range(12): painter.drawLine(88,0,96,0)#繪制水平線 painter.rotate(30.0)# 原有旋轉(zhuǎn)角度上進(jìn)行旋轉(zhuǎn); radius = 100 # 半徑 font = painter.font() font.setBold(True) painter.setFont(font) pointSize = font.pointSize()#字體大小 # print(pointSize) #繪制小時(shí)文本 for i in range(12): nhour = i + 3 # 從水平 3 點(diǎn)進(jìn)行繪制 if(nhour>12): nhour -= 12 painter.drawText(self.textRectF(radius*0.8,pointSize,i*30),Qt.AlignCenter,str(nhour)) #繪制分針; painter.setPen(Qt.NoPen) painter.setBrush(minute_color) painter.save() # 1分鐘為6°, painter.rotate(6.0*(time.minute()+time.second()/60.0)) painter.drawConvexPolygon(QPolygon(minute_points)) painter.restore() #繪制分針線 painter.setPen(minute_color) for i in range(60): if(i%5 !=0): painter.drawLine(92,0,96,0) painter.rotate(6.0) #繪制秒針 painter.setPen(Qt.NoPen) painter.setBrush(second_color) painter.save() #繪制秒線 painter.rotate(6.0*time.second()) painter.drawConvexPolygon(QPolygon(second_points)) painter.restore() painter.setPen(second_color) for i in range(360): if(i%5!=0 or i%30!=0):#繪制 painter.drawLine(94,0,96,0) painter.rotate(1.0)#旋轉(zhuǎn)
再設(shè)置一個(gè)時(shí)間計(jì)時(shí)控件,利用信號(hào)槽機(jī)制連接界面,每一秒更新一次界面
self.timer = QTimer() # 定時(shí)器 self.timer.timeout.connect(self.update) self.timer.start(1000) # 每1s 更新一次
電子表制作相對(duì)要比 老式鐘表制作 要簡(jiǎn)單地多,制作過(guò)程中用到 QLCDNumber 控件
QLDNumber 控件用來(lái)預(yù)覽數(shù)字,但上面的樣式讓數(shù)字看起來(lái)科技感更強(qiáng),作為電子表預(yù)覽是非常不錯(cuò)的選擇!
使用之前需對(duì)該控件的屬性做一下微調(diào),例如字體樣式,控件內(nèi)占據(jù)字符個(gè)數(shù)、邊框?qū)傩缘龋?/p>
self.lcdNumber = QtWidgets.QLCDNumber(Form) self.lcdNumber.setGeometry(QtCore.QRect(0, 0, 250, 50)) self.lcdNumber.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu) self.lcdNumber.setFrameShape(QtWidgets.QFrame.NoFrame) self.lcdNumber.setSmallDecimalPoint(False) self.lcdNumber.setDigitCount(8) self.lcdNumber.setSegmentStyle(QtWidgets.QLCDNumber.Flat) self.lcdNumber.setProperty("value", 2021.0) self.lcdNumber.setObjectName("lcdNumber")
電子表運(yùn)行效果也是借助于計(jì)時(shí)控件,每秒更新一次當(dāng)前界面的時(shí)間,但這里沒用到 QPainter
self.lcdNumber.display('00:00:00') time_slot =QTimer(self) # time_slot.setInterval(1000) # time_slot.start() time_slot.timeout.connect(self.event_1) time_slot.start(1000) def event_1(self): time_format = QTime.currentTime() time_format = time_format.toString("hh:mm:ss") self.lcdNumber.display(time_format) QApplication.processEvents()
兩個(gè)表界面創(chuàng)建完畢之后,最后用一個(gè) Widget 作為基類,利用 Qt 的水平布局把兩個(gè)表水平拼接在一起,形成了最終的效果
self.label1 = Clock_paint() self.label2 = MyWidget() self.horizon_layout = QHBoxLayout() self.horizon_layout.addWidget(self.label1) self.horizon_layout.addWidget(self.label2) self.setLayout(self.horizon_layout) self.setWindowTitle('時(shí)鐘--《公號(hào):小張Python》') self.setWindowIcon(QIcon('clock.jpg'))
“Python編程如何使用PyQt5制作動(dòng)態(tài)鐘表”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。