1. 程式人生 > >PyQt5學習教程14:顏色拾取對話方塊的使用

PyQt5學習教程14:顏色拾取對話方塊的使用

本文將介紹PyQt5中顏色拾取對話方塊的使用方法,我們將在上一個例程的基礎上,加入對TextBrowser背景顏色的更改功能,先看源程式。

源程式:

import sys
from PyQt5.QtWidgets import QWidget, \
                              QPushButton, \
                              QToolTip, \
                              QMessageBox, \
                              QApplication, \
                              QDesktopWidget, \
                              QMainWindow, \
                              QAction, \
                              qApp, \
                              QVBoxLayout, \
                              QHBoxLayout, \
                              QTextBrowser, \
                              QLineEdit, \
                              QLabel, \
                              QInputDialog, \
                              QColorDialog
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont, \
                          QIcon


# QMainWindow是QWidget的派生類
class CMainWindow(QMainWindow):

    def __init__(self):
        super().__init__()

        # ToolTip設定
        QToolTip.setFont(QFont('華文楷體', 10))

        # statusBar設定
        self.statusBar().showMessage('準備就緒')

        # 退出Action設定
        exitAction = QAction(QIcon('1.png'), '&Exit', self)
        exitAction.setShortcut('ctrl+Q')
        exitAction.setStatusTip('退出應用程式')
        exitAction.triggered.connect(qApp.quit)     # qApp就相當於QCoreApplication.instance()

        # menuBar設定
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)

        # toolBar設定
        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)

        # 確認PushButton設定
        btnOK = QPushButton("確認")
        btnOK.setToolTip("點選此按鈕將確認改變!")
        btnOK.setStatusTip("點選此按鈕將確認改變!")
        btnOK.clicked.connect(self.funOK)
        btnOK.resize(btnOK.sizeHint())

        # 取消PushButton設定
        btnCancel = QPushButton("取消")
        btnCancel.setToolTip("點選此按鈕將放棄改變!")
        btnCancel.setStatusTip("點選此按鈕將放棄改變!")
        btnCancel.clicked.connect(self.funCancel)
        btnCancel.resize(btnCancel.sizeHint())

        # 退出PushButton設定
        btnQuit = QPushButton('退出')
        btnQuit.setToolTip("點選此按鈕將退出應用程式!")
        btnQuit.setStatusTip("點選此按鈕將退出應用程式!")
        btnQuit.clicked.connect(qApp.quit)
        btnQuit.resize(btnQuit.sizeHint())

        # 更改提示PushButton設定
        btnTip = QPushButton('更改提示')
        btnTip.setToolTip("點選此按鈕將更改提示符!")
        btnTip.setStatusTip("點選此按鈕將更改提示符!")
        btnTip.clicked.connect(self.funTip)
        btnTip.resize(btnTip.sizeHint())

        # 更改背景色PushButton設定
        btnBackgroundColor = QPushButton('更改背景色')
        btnBackgroundColor.setToolTip("點選此按鈕將更改背景色!")
        btnBackgroundColor.setStatusTip("點選此按鈕將更改背景色!")
        btnBackgroundColor.clicked.connect(self.funBackgroundColor)
        btnBackgroundColor.resize(btnBackgroundColor.sizeHint())

        # PushButton佈局
        hBox1 = QHBoxLayout()
        hBox1.addStretch(1)
        hBox1.addWidget(btnBackgroundColor)
        hBox1.addWidget(btnTip)
        hBox1.addWidget(btnOK)
        hBox1.addWidget(btnCancel)
        hBox1.addWidget(btnQuit)

        # QTextBrwoser是隻讀的多行文字框,既可以顯示普通文字,又可以顯示HTML
        self.textBrowser = QTextBrowser()
        # 提示標籤
        self.labTip = QLabel(">>>")
        # 單行文字框
        self.lineEdit = QLineEdit("請輸入表示式,然後按確認鍵")
        self.lineEdit.selectAll()
        self.lineEdit.returnPressed.connect(self.funOK)
        # 佈局
        hBox2 = QHBoxLayout()
        hBox2.addWidget(self.labTip)
        hBox2.addWidget(self.lineEdit)

        # 佈局
        vBox = QVBoxLayout()
        vBox.addWidget(self.textBrowser)
        vBox.addLayout(hBox2)
        vBox.addLayout(hBox1)
        widget = QWidget()
        self.setCentralWidget(widget)  # 建立的widget在窗體的中間位置
        widget.setLayout(vBox)

        # 佈局完畢後,才可得到焦點
        self.lineEdit.setFocus()

        # Window設定
        self.resize(500, 300)
        self.center()
        self.setFont(QFont('華文楷體', 10))
        self.setWindowTitle('PyQt5應用教程(snmplink編著)')
        self.setWindowIcon(QIcon('10.png'))
        self.show()

    def center(self):
        # 得到主窗體的框架資訊
        qr = self.frameGeometry()
        # 得到桌面的中心
        cp = QDesktopWidget().availableGeometry().center()
        # 框架的中心與桌面中心對齊
        qr.moveCenter(cp)
        # 自身窗體的左上角與框架的左上角對齊
        self.move(qr.topLeft())

    def funOK(self):
        try:
            text = self.lineEdit.text()
            self.textBrowser.append("{} = <b>{}</b>".format(text, eval(text)))
        except:
            self.textBrowser.append("輸入的表示式<font color=red>“{}”</font>無效!".format(text))

    def funCancel(self):
        self.lineEdit.clear()

    def funTip(self):
        # 返回兩個值:輸入的文字和點選的按鈕
        text, ok = QInputDialog.getText(self, '請輸入新的提示符', '提示符:')
        if ok:
            self.labTip.setText(text)

    def funBackgroundColor(self):
        col = QColorDialog.getColor()
        if col.isValid():
            self.textBrowser.setStyleSheet("QTextBrowser{background-color:%s}" % col.name())

    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape:
            self.close()

    def closeEvent(self, QCloseEvent):
        reply = QMessageBox.question(self,
                                     'PyQt5應用教程(snmplink編著)',
                                     "是否要退出應用程式?",
                                     QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.No)
        if reply == QMessageBox.Yes:
            QCloseEvent.accept()
        else:
            QCloseEvent.ignore()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = CMainWindow()
    sys.exit(app.exec_())

程式解釋:

1、第17行:輸入QColorDialog模組,使用該模組,可新增顏色拾取對話方塊。

2、第79-83行:增加更改TextBrowser背景色的PushButton,與funBackgroundColor方法關聯。

3、第86-92行:對PushButton進行佈局。

4、第153行:定義funBackgroundColor方法。

5、第154行:呼叫QColorDialog的getColor方法得到使用者輸入的顏色。

6、第155行:判斷使用者輸入的顏色是否有效。

7、第156行:通過呼叫setStyleSheet方法,設定TextBrowser的背景色,其輸入的內容類似CSS,可以對字型,字號、顏色等很多功能進行設定,具體使用方法大家在網上搜索就好,或者檢視PyQt的幫助。

程式執行效果:


我們點選更改背景色PushButton儘可以對TextBrowser的背景顏色進行更改了。