1. 程式人生 > >[ PyQt入門教程 ] PyQt5基本控制元件使用:訊息彈出、使用者輸入、檔案對話方塊

[ PyQt入門教程 ] PyQt5基本控制元件使用:訊息彈出、使用者輸入、檔案對話方塊

   本文主要介紹PyQt介面實現中常用的訊息彈出對話方塊、提供使用者輸入的輸入框、開啟檔案獲取檔案/目錄路徑的檔案對話方塊。學習這三種控制元件前,先想一下它們使用的主要場景:

  1、訊息彈出對話方塊。程式遇到問題需要退出需要彈出錯誤提示框 、程式執行可能造成的風險需要彈出警告視窗提示使用者是否進一步執行等等。

  2、使用者輸入框。比如常見的讓使用者選擇執行的程式分支、yes/no等等。

  3、檔案對話方塊。獲取本地檔案或者資料夾的完整路徑甚至是直接開啟檔案顯示檔案內容。

  本文主要針對這三種控制元件的主要場景進行介紹。

QMessageBox:彈出對話方塊控制元件

  QMessageBox是一種通用的彈出式對話方塊,用於顯示訊息,允許使用者通過單擊不同的標準按鈕對訊息進行反饋。彈出式對話方塊有很多型別,如提示、警告、錯誤、詢問、關於等對話方塊。這些不同型別的QMessageBox對話方塊只是顯示時圖示不同,其他功能一樣。

  QMessageBox類中常用方法

    information(QWdiget parent,title,text,buttons,defaultButton):彈出訊息對話方塊。

    question(QWidget parent,title,text,buttons,defaultButton):彈出問答對話方塊

    warning(QWidget parent,title,text,buttons,defaultButton):彈出警告對話方塊

    critical(QWidget parent,title,text,buttons,defaultButton):彈出嚴重錯誤對話方塊

    about(QWidget parent,title,text):彈出關於對話

  引數解釋如下:

    parent:指定的父視窗控制元件。

    title:表示對話方塊標題。

    text:表示對話方塊文字。

    buttons:表示多個標準按鈕,預設為ok按鈕。

    defaultButton表示預設選中的標準按鈕,預設選中第一個標準按鈕。

  其他方法如下:

    setTitle():設定標題

    setText():設定正文訊息

    setIcon():設定彈出對話方塊的圖片

  QMessageBox的標準按鈕型別

    QMessage.Ok 同意操作、QMessage.Cancel  取消操作、QMessage.Yes  同意操作、QMessage.No  取消操作、QMessage.Abort  終止操作、QMessage.Retry 重試操作、QMessage.Ignore  忽略操作

  5種常用的訊息對話方塊及其顯示效果

  (1)訊息對話方塊,用來告訴使用者關於提示資訊

    QMessageBox.information(self, '資訊提示對話方塊','前方右拐到達目的地',QMessageBox.Yes | QMessageBox.No)

  (2)提問對話方塊,用來告訴使用者關於提問訊息。

  QMessageBox.question(self, "提問對話方塊", "你要繼續搞測試嗎?", QMessageBox.Yes | QMessageBox.No)

  (3)警告對話方塊,用來告訴使用者關於不尋常的錯誤訊息。

  QMessageBox.warning(self, "警告對話方塊", "繼續執行會導致系統重啟,你確定要繼續?", QMessageBox.Yes | QMessageBox.No)

  (4)嚴重錯誤對話方塊,用來告訴使用者關於嚴重的錯誤訊息。

  QMessageBox.critical(self, "嚴重錯誤對話方塊", "陣列越界,程式異常退出", QMessageBox.Yes | QMessageBox.No)

 (5)關於對話方塊

  QMessageBox.about(self, "關於對話方塊", "你的Windows系統是DOS1.0")

上述程式完整程式碼如下:

# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(431, 166)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(160, 50, 91, 41))
        font = QtGui.QFont()
        font.setFamily("YaHei Consolas Hybrid")
        font.setPointSize(10)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "對話方塊"))
        self.pushButton.setText(_translate("Form", "彈出對話方塊"))

class MyMainForm(QMainWindow, Ui_Form):
    def __init__(self, parent=None):
        super(MyMainForm, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.showMsg)

    def showMsg(self):
        QMessageBox.information(self, '資訊提示對話方塊','前方右拐到達目的地',QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes)
        QMessageBox.question(self, "提問對話方塊", "你要繼續搞測試嗎?", QMessageBox.Yes | QMessageBox.No)
        QMessageBox.warning(self, "警告對話方塊", "繼續執行會導致系統重啟,你確定要繼續?", QMessageBox.Yes | QMessageBox.No)
        QMessageBox.critical(self, "嚴重錯誤對話方塊", "陣列越界,程式異常退出", QMessageBox.Yes | QMessageBox.No,)
        QMessageBox.about(self, "關於對話方塊", "你的Windows系統是DOS1.0")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWin = MyMainForm()
    myWin.show()
    sys.exit(app.exec_())

QInputDialog標準對話方塊控制元件

  QInputDialog控制元件是一個標準對話方塊,用於獲取使用者輸入資訊,QInputDialog控制元件可以提供數字、字串輸入或提供下拉列表選擇。

  針對QInputDialog對話方塊控制元件的使用,我們主要考慮2個問題:1、如何在彈出對話方塊供使用者輸入,2、如何獲取使用者輸入。

  QInputDialog常用方法:

    getint():從控制元件中獲得標準整數輸入

    getDouble():從控制元件中獲得標準浮點數輸入

    getText():從控制元件中獲得標準字串的輸入

    getItem() :從控制元件中獲得列表裡的選項輸入

  說明:QInputDialog控制元件

完整程式碼如下:

# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox,QInputDialog

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(382, 190)
        font = QtGui.QFont()
        font.setPointSize(9)
        font.setBold(False)
        font.setWeight(50)
        Form.setFont(font)
        self.GetIntlineEdit = QtWidgets.QLineEdit(Form)
        self.GetIntlineEdit.setGeometry(QtCore.QRect(150, 30, 150, 31))
        self.GetIntlineEdit.setText("")
        self.GetIntlineEdit.setObjectName("GetIntlineEdit")
        self.GetstrlineEdit = QtWidgets.QLineEdit(Form)
        self.GetstrlineEdit.setGeometry(QtCore.QRect(150, 80, 150, 31))
        self.GetstrlineEdit.setObjectName("GetstrlineEdit")
        self.GetItemlineEdit = QtWidgets.QLineEdit(Form)
        self.GetItemlineEdit.setGeometry(QtCore.QRect(150, 130, 150, 31))
        self.GetItemlineEdit.setObjectName("GetItemlineEdit")
        self.getIntButton = QtWidgets.QPushButton(Form)
        self.getIntButton.setGeometry(QtCore.QRect(50, 30, 80, 31))
        self.getIntButton.setObjectName("getIntButton")
        self.getStrButton = QtWidgets.QPushButton(Form)
        self.getStrButton.setGeometry(QtCore.QRect(50, 80, 80, 31))
        self.getStrButton.setObjectName("getStrButton")
        self.getItemButton = QtWidgets.QPushButton(Form)
        self.getItemButton.setGeometry(QtCore.QRect(50, 130, 80, 31))
        self.getItemButton.setObjectName("getItemButton")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "QInputDialog例子"))
        self.getIntButton.setText(_translate("Form", "獲取整數"))
        self.getStrButton.setText(_translate("Form", "獲取字串"))
        self.getItemButton.setText(_translate("Form", "獲取列表選項"))

class MyMainForm(QMainWindow, Ui_Form):
    def __init__(self, parent=None):
        super(MyMainForm, self).__init__(parent)
        self.setupUi(self)
        self.getIntButton.clicked.connect(self.getInt)
        self.getStrButton.clicked.connect(self.getStr)
        self.getItemButton.clicked.connect(self.getItem)

    def getInt(self):
        num, ok = QInputDialog.getInt(self, 'Integer input dialog', '輸入數字')
        if ok and num:
           self.GetIntlineEdit.setText(str(num))

    def getStr(self):
        text, ok=QInputDialog.getText(self, 'Text Input Dialog', '輸入姓名:')
        if ok and text:
            self.GetstrlineEdit.setText(str(text))

    def getItem(self):
        items=('C', 'C++', 'C#', 'JAva', 'Python')
        item, ok=QInputDialog.getItem(self, "select input dialog", '語言列表', items, 0, False)
        if ok and item:
            self.GetItemlineEdit.setText(str(item))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWin = MyMainForm()
    myWin.show()
    sys.exit(app.exec_())

關鍵程式碼介紹:

  QInputDialog.getInt(self, 'Integer input dialog', '輸入數字') -> 輸入整數對話方塊

  QInputDialog.getText(self, 'Text Input Dialog', '輸入姓名:') -> 輸入字串對話方塊

  QInputDialog.getItem(self, "select input dialog", '語言列表', items, 0, False) -> 下拉列表選擇對話方塊

QFileDialog檔案對話方塊

  QFileDialog是用於開啟和儲存檔案的標準對話方塊。使用QFileDialog控制元件主要考慮2個場景:使用該控制元件提供使用者選擇目錄或檔案,並儲存選擇目錄或檔案的路徑。簡單說就是實現類似word/Notepad++檔案開啟功能。如下

   針對上述場景,QFileDialog控制元件實現的主要方法:

    QFileDialog.getOpenFileName():獲取單個檔案路徑

    QFileDialog.getOpenFileNames():獲取多個檔案路徑

    QFileDialog.getExistingDirectory():獲取資料夾路徑

完整程式碼如下:

# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox,QInputDialog,QFileDialog

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(443, 120)
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setGeometry(QtCore.QRect(50, 40, 301, 25))
        self.widget.setObjectName("widget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.openFileButton = QtWidgets.QPushButton(self.widget)
        self.openFileButton.setObjectName("openFileButton")
        self.horizontalLayout.addWidget(self.openFileButton)
        self.filePathlineEdit = QtWidgets.QLineEdit(self.widget)
        self.filePathlineEdit.setObjectName("filePathlineEdit")
        self.horizontalLayout.addWidget(self.filePathlineEdit)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "QFileDialog開啟檔案例子"))
        self.openFileButton.setText(_translate("Form", "開啟檔案"))

class MyMainForm(QMainWindow, Ui_Form):
    def __init__(self, parent=None):
        super(MyMainForm, self).__init__(parent)
        self.setupUi(self)
        self.openFileButton.clicked.connect(self.openFile)

    def openFile(self):
        get_directory_path = QFileDialog.getExistingDirectory(self,
                                    "選取指定資料夾",
                                    "C:/")
        self.filePathlineEdit.setText(str(get_directory_path))

        get_filename_path, ok = QFileDialog.getOpenFileName(self,
                                    "選取單個檔案",
                                   "C:/",
                                    "All Files (*);;Text Files (*.txt)")
        if ok:
            self.filePathlineEdit.setText(str(get_filename_path))

        get_filenames_path, ok = QFileDialog.getOpenFileNames(self,
                                    "選取多個檔案",
                                   "C:/",
                                    "All Files (*);;Text Files (*.txt)")
        if ok:
            self.filePathlineEdit.setText(str(' '.join(get_filenames_path)))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWin = MyMainForm()
    myWin.show()
    sys.exit(app.exec_())

 關鍵程式碼介紹

    QFileDialog.getOpenFileName(self,"選取單個檔案","C:/","All Files (*);;Text Files (*.txt)") -> 獲取單個指定檔案的絕對路徑

   getOpenFileName()引數說明:

   第1個引數:用於指定父元件

   第2個引數:對話方塊標題

   第3個引數:對話方塊顯示時預設開啟的目錄。"."表示當前程式所在目錄,“/”表示當前盤下的根目錄。

    第4個引數:對話方塊中副檔名過濾器。All Files (*);;Text Files (*.txt)表示可以選擇所有檔案型別或者只顯示.txt字尾的檔案型別。

  QFileDialog.getExistingDirectory(self,"選取指定資料夾","C:/") -> 獲取指定資料夾的絕對路徑

  QFileDialog.getOpenFileNames(self,"選取多個檔案","C:/","All Files (*);;Text Files (*.txt)") -> 獲取多個指定檔案的絕對路徑

小結

  本文介紹了訊息彈出對話方塊、使用者輸入對話方塊以及檔案開啟對話方塊的基本使用方法。內容覆蓋了這三類控制元件的基本使用場景。可以開始動手嘗試了。。