[ PyQt入門教程 ] PyQt5基本控件使用:消息彈出、用戶輸入、文件/目錄選擇對話框

  • 2019 年 10 月 3 日
  • 筆記

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

  1、消息彈出對話框。程序遇到問題需要退出需要彈出錯誤提示框 、程序執行可能造成的風險需要彈出警告窗口提示用戶是否進一步執行等等。

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

  3、文件對話框。獲取本地文件或者文件夾的完整路徑甚至是直接打開文件顯示文件內容。

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

1、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種常用的消息對話框及其顯示效果

    提前說明:from PyQt5.QtWidgets import QMessageBox 導入直接使用

  (1)消息對話框,用來告訴用戶關於提示信息

    QMessageBox.information(self, ‘信息提示對話框’,’前方右拐到達目的地’,QMessageBox.Yes | QMessageBox.No)

  (2)提問對話框,用來告訴用戶關於提問消息。

  QMessageBox.question(self, “提問對話框”, “你要繼續搞測試嗎?”, QMessageBox.Yes | QMessageBox.No)

  對於提問對話框,需要根據用戶選擇Yes或者No進行下一步判斷,可以獲取按鈕點擊的返回值進行判斷,選擇NO的返回值為65536,選擇Yes的返回值為其他。。示例如下:

(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_())

運行結果(順序彈出以下消息框)。

關鍵代碼

2、QInputDialog標準對話框控件

  QInputDialog控件是一個標準對話框,用於獲取用戶輸入信息,QInputDialog控件可以提供數字、字符串輸入或提供下拉列表選擇。

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

  QInputDialog常用方法:

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

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

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

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

完整代碼如下(代碼可直接複製運行):

# -*- 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) -> 下拉列表選擇對話框

3、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)”) -> 獲取多個指定文件的絕對路徑

小結

  本文介紹了消息彈出對話框、用戶輸入對話框以及文件打開對話框的基本使用方法。內容覆蓋了這三類控件的基本使用場景。可以開始動手嘗試了。。