[PyQt入门教程]PyQt5基本控件使用:消息弹出、用户输入、文件目录选择对话框
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[PyQt⼊门教程]PyQt5基本控件使⽤:消息弹出、⽤户输⼊、⽂
件⽬录选择对话框
本⽂主要介绍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)消息对话框,⽤来告诉⽤户关于提⽰信息
rmation(self, '信息提⽰对话框','前⽅右拐到达⽬的地',QMessageBox.Yes | QMessageBox.No)
(2)提问对话框,⽤来告诉⽤户关于提问消息。
QMessageBox.question(self, "提问对话框", "你要继续搞测试吗?", QMessageBox.Yes | QMessageBox.No)
特别注意Tips:对于提问对话框,需要根据⽤户选择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):
rmation(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)") -> 获取多个指定⽂件的绝对路径
⼩结
本⽂介绍了消息弹出对话框、⽤户输⼊对话框以及⽂件打开对话框的基本使⽤⽅法。
内容覆盖了这三类控件的基本使⽤场景。
可以开始动⼿尝试了。