亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python編程使用PyQt5制作動態(tài)鐘表示例

 更新時間:2021年10月08日 14:34:08   作者:小張Python  
本篇文章將用 Python 同時繪制兩種類型的表;一個是上面提到的含有時、分、秒針的鐘表(為了方便,下面統(tǒng)稱為老式鐘表),一個是電子表,最終運行效果文中如下呈現(xiàn)

前言

大家好,我是小張~

記得小時候,家里只有一個鐘表用來看時間(含有時針、分針、秒針的那種),掛在墻上噠噠噠響個不停,現(xiàn)在生活條件好了、基本人手一部手機,看時間也不再依靠表了,而今天的文章內(nèi)容就是與這類鐘表相關(guān);

Clock

環(huán)境配置

程序中用到的Python包

PyQt5
math
sys

實現(xiàn)思路

實現(xiàn)思路分為大致分為三個部分:老式鐘表制作、電子表制作、兩表合并為一個界面

老式鐘表制作

整體來看老式鐘表界面,有以下幾種圖案:時針、分針、秒針、1-12小時刻度、每格小刻度、每5格一大刻度

image-20210226225519399

在鐘表運行時,時針、分針、秒針 隨時間變化以界面中心為圓點逆時針旋轉(zhuǎn)一定的角度,這個角度可以計算出來的

為了方便,整個界面效果我用 PyQt5 中的 QPainter 控件來實現(xiàn),這個控件其實就是一個繪制器,用來繪制界面上的元素

時鐘運行軌跡其實就是把每一秒的畫面拼接在一起,最后組成一個連貫的時間序列圖像,因此重寫了 paintEvent 函數(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)前時間
        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) #進行尺度縮放
        #----------繪制時針------------
        painter.setPen(Qt.NoPen)
        painter.setBrush(hour_color)#顏色
        painter.save()
        # 根據(jù) 1小時時= 30°,水品方向逆時針旋轉(zhuǎn)時針
        painter.rotate(30.0*((time.hour()+time.minute()/60.0)))
        painter.drawConvexPolygon(QPolygon(hour_points))
        painter.restore() # save 退出,可重新設(shè)置畫筆
        painter.setPen(hour_color)
        #繪制小時線(360/12 = 30度)
        for i in range(12):
            painter.drawLine(88,0,96,0)#繪制水平線
            painter.rotate(30.0)# 原有旋轉(zhuǎn)角度上進行旋轉(zhuǎn);
        radius = 100 # 半徑
        font = painter.font()
        font.setBold(True)
        painter.setFont(font)
        pointSize = font.pointSize()#字體大小
        # print(pointSize)
        #繪制小時文本
        for i in range(12):
            nhour = i + 3 # 從水平 3 點進行繪制
            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è)置一個時間計時控件,利用信號槽機制連接界面,每一秒更新一次界面

        self.timer = QTimer()  # 定時器
        self.timer.timeout.connect(self.update)
        self.timer.start(1000)  # 每1s 更新一次

電子表制作

電子表制作相對要比 老式鐘表制作 要簡單地多,制作過程中用到 QLCDNumber 控件

image-20210226230452359

QLDNumber 控件用來預(yù)覽數(shù)字,但上面的樣式讓數(shù)字看起來科技感更強,作為電子表預(yù)覽是非常不錯的選擇!

image-20210226222436801

使用之前需對該控件的屬性做一下微調(diào),例如字體樣式,控件內(nèi)占據(jù)字符個數(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")

電子表運行效果也是借助于計時控件,每秒更新一次當(dāng)前界面的時間,但這里沒用到 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()

合并兩表界面

兩個表界面創(chuàng)建完畢之后,最后用一個 Widget 作為基類,利用 Qt 的水平布局把兩個表水平拼接在一起,形成了最終的效果

image-20210226225435210

核心代碼

  		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('時鐘--《公號:小張Python》')
        self.setWindowIcon(QIcon('clock.jpg'))

總結(jié)

本文中的案例算是 PyQt5 的一個小應(yīng)用,PyQt5 是 Qt 在 Python 語言中的封裝,制作 GUI界面時 個人非常推薦這個庫,相對于 tk 我更喜歡前者,因為它GUI制作靈活性更強,后續(xù)打算出更多小案例來介紹 PyQt5 的相關(guān)用法,敬請期待!

好了以上就是本篇文章的全部內(nèi)容,最后感謝大家的閱讀,我們下期見~

希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django中外鍵使用總結(jié)

    Django中外鍵使用總結(jié)

    本文主要介紹了Django中外鍵使用總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Python中的迭代器你了解嗎

    Python中的迭代器你了解嗎

    迭代器是一種特殊的對象,它實現(xiàn)了迭代協(xié)議,允許按照一定的順序逐個訪問元素,本文就來帶大家深入了解一下Python中迭代器的使用,需要的可以參考下
    2023-05-05
  • Python統(tǒng)計python文件中代碼,注釋及空白對應(yīng)的行數(shù)示例【測試可用】

    Python統(tǒng)計python文件中代碼,注釋及空白對應(yīng)的行數(shù)示例【測試可用】

    這篇文章主要介紹了Python統(tǒng)計python文件中代碼,注釋及空白對應(yīng)的行數(shù),涉及Python針對py文件的讀取、遍歷、判斷、統(tǒng)計等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Python集合set的交集和并集操作方法

    Python集合set的交集和并集操作方法

    這篇文章主要介紹了Python集合set的交集和并集操作方法小,python的set,是一個無序不重復(fù)元素集,?基本功能包括關(guān)系測試和消除重復(fù)元素本文講述了python中set集合的比較方法包括交集,并集,差集,下文更多詳細資料,需要的小伙伴可以參考一下
    2022-03-03
  • 用Python實現(xiàn)BP神經(jīng)網(wǎng)絡(luò)(附代碼)

    用Python實現(xiàn)BP神經(jīng)網(wǎng)絡(luò)(附代碼)

    這篇文章主要介紹了用Python實現(xiàn)BP神經(jīng)網(wǎng)絡(luò)(附代碼),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python 在區(qū)塊鏈智能合約開發(fā)中的應(yīng)用與實踐小結(jié)

    Python 在區(qū)塊鏈智能合約開發(fā)中的應(yīng)用與實踐小結(jié)

    Python作為一種廣泛應(yīng)用的編程語言,在區(qū)塊鏈智能合約開發(fā)中扮演著重要角色,通過使用Python框架如Brownie和Web3.py,開發(fā)者可以輕松編寫和部署智能合約,感興趣的朋友一起看看吧
    2024-09-09
  • python中匿名函數(shù)的應(yīng)用方法

    python中匿名函數(shù)的應(yīng)用方法

    這篇文章主要介紹了python中匿名函數(shù)的應(yīng)用方法,匿名函數(shù)是無需使用def定義的函數(shù),只需使用關(guān)鍵字lambda進行聲明,且只可使用一次,只有一個返回值,需要的朋友可以參考下
    2023-07-07
  • python下函數(shù)參數(shù)的傳遞(參數(shù)帶星號的說明)

    python下函數(shù)參數(shù)的傳遞(參數(shù)帶星號的說明)

    python中函數(shù)參數(shù)的傳遞是通過賦值來傳遞的。
    2010-09-09
  • Python安裝依賴(包)模塊方法詳解

    Python安裝依賴(包)模塊方法詳解

    Python模塊,簡單說就是一個.py文件,其中可以包含我們需要的任意Python代碼。這篇文章主要介紹了Python安裝依賴(包)模塊方法,需要的朋友可以參考下
    2020-02-02
  • python游戲的魅力之冒險島實戰(zhàn)項目

    python游戲的魅力之冒險島實戰(zhàn)項目

    我看了一眼沉迷《夢幻國度》的兒子!氣就不打一處來!讓你見識一下Python游戲的魅力,python實戰(zhàn)冒險島游戲碼起,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值
    2021-09-09

最新評論