Ansel Ch

[PyQt5] 做一個GUI介面的時鐘吧!

max

專案地址:https://github.com/AnselCh/widget_clock

目標

做出一個可以自訂位子且能調整透明度的小時鐘。

正文

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from time import strftime
import sys
import threading

載入GUI套件跟多執行緒,因為不能因調整透明度導致時間暫停更新,所以採用多執行緒。

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Ann Clock')
        self.setWindowFlags(Qt.WindowStaysOnTopHint)  # 視窗置頂
        self.setWindowFlag(Qt.FramelessWindowHint)  # 標題列消失
        self.setAttribute(Qt.WA_TranslucentBackground)  # 整個label以外設為半透明
        self.resize(360, 110)
        self.setUpdatesEnabled(True)  # 時間更新的Thread
        self.ui()
        self.clock_window = True

主視窗建置跟設定

def ui(self):

        self.label_time = QLabel(self)
        font = QFont()
        font.setFamily('calibri')
        font.setPointSize(40)
        font.setBold(True)
        self.label = QLabel(self)
        self.label.setGeometry(140, 90, 100, 30)
        self.label_time.setFont(font)
        self.label_time.setAlignment(Qt.AlignCenter)
        radius = 12
        self.label_time.setStyleSheet('''
            color:	black;
            background:rgb(245, 245, 245);
            border-top-left-radius:{0}px;
            border-bottom-left-radius:{0}px;
            border-top-right-radius:{0}px;
            border-bottom-right-radius:{0}px;
            '''.format(radius))
        self.slider = QSlider(self)
        self.slider.setGeometry(30, 75, 300, 30)
        self.slider.setRange(1, 10)
        self.slider.setValue(5)
        self.slider.setOrientation(1)
        self.slider.setStyleSheet('''
        QSlider {   border-radius: 10px;    }
        QSlider::groove:horizontal {
            height: 5px;
            background: #C2C287;
        }
        QSlider::handle:horizontal{
            background: #FFFFAA;
            width: 16px;
            height: 16px;
            margin:-6px 0;
            border-radius:8px;
        }
        QSlider::sub-page:horizontal{
            background:#A5A552;
        }
        ''')

setStyleSheet設定四個角的平滑度跟label顏色
並加上slider(滑桿)調整透明度

def nowtime(self):
        while self.clock_window:
            string = strftime('%H:%M:%S %p')
            self.label_time.setText(string)

這邊是刷新時間的while迴圈,等等會用一個執行緒調用

def transparency(self):
        while self.clock_window:
            user_setting = ((self.slider.value())/10)
            tran = user_setting
            self.setWindowOpacity(tran)

這邊是讀取slider調整數值while迴圈,等等會用另一個執行緒調用,來實現一邊調整透明度又不影響時間更新。

def closeEvent(self, event):
        self.clock_window = False

def mousePressEvent(self, event):
    self.oldPosition = event.globalPos()

def mouseMoveEvent(self, event):
    delta = QPoint(event.globalPos() - self.oldPosition)
    self.move(self.x() + delta.x(), self.y() + delta.y())
    self.oldPosition = event.globalPos()

closeEvent是結束視窗函數,下面兩段則是讓視窗能夠點及任何位子就能拉到自訂位子,不過在ubuntu上執行位子會有點怪怪的,不確定是不是我個人問題?

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWidget()
    clock = threading.Thread(target=window.nowtime)
    se = threading.Thread(target=window.transparency)
    clock.start()
    se.start()
    window.show()
    sys.exit(app.exec_())

最後是啟動GUI的函式。