Python之PyQt6對話框的實現(xiàn)
對話框是界面編程中重要的窗體,一般用于提示或者一些其他特定操作。

使用QDialog顯示通用消息框
直接使用QDialog類,可以及通過對話框進(jìn)行通用對話框顯示,亦可以通過自定義設(shè)置自己需要的對話框。
# _*_ coding:utf-8 _*_
import sys
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QApplication
from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QVBoxLayout
from PyQt6.QtWidgets import QHBoxLayout
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QDialog
from PyQt6.QtGui import QIcon
from PyQt6.QtCore import Qt
class MainWindowView(QMainWindow):
"""主窗體界面"""
def __init__(self):
"""構(gòu)造函數(shù)"""
super().__init__()
self.setWindowTitle("MainWindow")
self.setWindowIcon(QIcon(r"./res/folder_pictures.ico"))
self.resize(300, 200)
self.setMinimumSize(600, 400)
self.center()
self.initui()
def initui(self):
"""初始函數(shù)"""
self.vboxlayout = QVBoxLayout(self)
self.main_widget = QWidget()
self.main_widget.setLayout(self.vboxlayout)
self.setCentralWidget(self.main_widget)
self.hboxlayout = QHBoxLayout(self)
self.btn = QPushButton(self)
self.btn.setText("彈出對話框")
self.btn.move(100,100)
self.btn.clicked.connect(self.show_dialog)
def center(self):
"""居中顯示"""
win_rect = self.frameGeometry() # 獲取窗口矩形
screen_center = self.screen().availableGeometry().center() # 屏幕中心
win_rect.moveCenter(screen_center) # 移動窗口矩形到屏幕中心
self.move(win_rect.center()) # 移動窗口與窗口矩形重合
def show_dialog(self):
dialog = QDialog()
button = QPushButton("確定", dialog)
button.clicked.connect(dialog.close)
button.move(50,50)
dialog.setWindowTitle("QDialog")
dialog.setWindowModality(Qt.WindowModality.ApplicationModal)
dialog.exec()
if __name__ == "__main__":
app = QApplication(sys.argv)
view = MainWindowView()
view.show()
sys.exit(app.exec())結(jié)果:

點擊按鈕可以彈出對話框,可以添加對應(yīng)的按鈕關(guān)聯(lián)信號進(jìn)行窗體關(guān)閉或控制。
使用QMessageBox顯示不同的對話框
QMessageBox是通用的消息對話框,包括如下多種形式,不同的對話框有不同的圖標(biāo)和按鈕,還可以根據(jù)自己需要微調(diào)樣式。
# _*_ coding:utf-8 _*_
import sys
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QApplication
from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QVBoxLayout
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QMessageBox
from PyQt6.QtGui import QIcon
from PyQt6.QtCore import Qt
class DemoQMessageBox(QMainWindow):
"""主窗體界面"""
def __init__(self):
"""構(gòu)造函數(shù)"""
super().__init__()
self.setWindowTitle("MainWindow")
self.setWindowIcon(QIcon(r"./res/20 (3).ico"))
self.resize(300, 200)
self.setMinimumSize(600, 400)
self.center()
self.initui()
def initui(self):
"""初始函數(shù)"""
self.vboxlayout = QVBoxLayout(self)
self.vboxlayout.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.main_widget = QWidget()
self.main_widget.setLayout(self.vboxlayout)
self.setCentralWidget(self.main_widget)
btns = ["關(guān)于對話框", "錯誤對話框", "警告對話框", "提問對話框", "消息對話框",]
for btnname in btns:
"""添加button"""
btn = QPushButton(btnname)
self.vboxlayout.addWidget(btn)
btn.clicked.connect(self.show_dialog)
def center(self):
"""居中顯示"""
win_rect = self.frameGeometry() # 獲取窗口矩形
screen_center = self.screen().availableGeometry().center() # 屏幕中心
win_rect.moveCenter(screen_center) # 移動窗口矩形到屏幕中心
self.move(win_rect.center()) # 移動窗口與窗口矩形重合
def show_dialog(self):
if type(self.sender()) is QPushButton:
btn_text = self.sender().text()
if btn_text == "關(guān)于對話框":
QMessageBox.about(self, "關(guān)于", "這是關(guān)與對話框")
elif btn_text == "錯誤對話框":
QMessageBox.critical(self,"錯誤","程序發(fā)生了錯誤!",QMessageBox.StandardButton.Ignore | QMessageBox.StandardButton.Abort | QMessageBox.StandardButton.Retry,QMessageBox.StandardButton.Retry)
elif btn_text == "警告對話框":
QMessageBox.warning(
self, "警告", "余量不足。", QMessageBox.StandardButton.Ok, QMessageBox.StandardButton.Ok)
elif btn_text == "提問對話框":
QMessageBox.question(self, "提問", "是否取消" ,QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,QMessageBox.StandardButton.Yes)
elif btn_text == "消息對話框":
QMessageBox.information(
self, "消息", "這是通知消息", QMessageBox.StandardButton.Ok, QMessageBox.StandardButton.Ok)
if __name__ == "__main__":
app = QApplication(sys.argv)
view = DemoQMessageBox()
view.show()
sys.exit(app.exec())結(jié)果:

點擊不同按鈕,顯示不同的消息窗口:
關(guān)于對話框:

錯誤對話框:

警告對話框:

提問對話框:

消息對話框:

輸入對話框
輸入對話框,用于彈窗獲取用戶的輸入信息,包含輸入列表,輸入文本,輸入數(shù)字等方式。
- QInputDialog.getItem(self,"獲取選項消息框", "名字列表", items),返回值Tuple[str, bool]
- QInputDialog.getText(self,"獲取文本消息框", "請輸入文本信息:"),返回值Tuple[str, bool]
- QInputDialog.getInt(self,"獲取整數(shù)消息框", "請輸入整數(shù):"),返回值Tuple[int, bool]
- QInputDialog.getMultiLineText(parent: QWidget, title: str, label: str, text: str = ..., flags: QtCore.Qt.WindowType = ..., inputMethodHints: QtCore.Qt.InputMethodHint = ...) -> typing.Tuple[str, bool]
- QInputDialog.getDouble(parent: QWidget, title: str, label: str, value: float = ..., min: float = ..., max: float = ..., decimals: int = ..., flags: QtCore.Qt.WindowType = ..., step: float = ...) -> typing.Tuple[float, bool]
示例:
# _*_ coding:utf-8 _*_
import sys
from PyQt6.QtWidgets import QApplication
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QFormLayout
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QLineEdit
from PyQt6.QtWidgets import QInputDialog
from PyQt6.QtGui import QColor
from PyQt6.QtGui import QIcon
from PyQt6.QtCore import Qt
class QInputDialogDemoView(QMainWindow):
"""輸入消息框類"""
def __init__(self):
"""構(gòu)造函數(shù)"""
super().__init__()
self.setWindowTitle("MainWindow")
self.setWindowIcon(QIcon(r"./res/20 (3).ico"))
self.resize(200, 100)
self.center()
self.initui()
def center(self):
"""居中顯示"""
win_rect = self.frameGeometry() # 獲取窗口矩形
screen_center = self.screen().availableGeometry().center() # 屏幕中心
# 移動窗口矩形到屏幕中心
win_rect.moveCenter(screen_center)
# 移動窗口與窗口矩形重合
self.move(win_rect.center())
def initui(self):
"""初始函數(shù)"""
# 創(chuàng)建表單布局作為底層布局
self.formlayout = QFormLayout(self)
self.formlayout.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.main_widget = QWidget()
self.main_widget.setLayout(self.formlayout)
self.setCentralWidget(self.main_widget)
# 添加獲取選項按鈕
self.btn_getitem = QPushButton("Get Item")
self.btn_getitem.clicked.connect(self.get_item)
self.ledit_getitem = QLineEdit()
self.formlayout.addRow(self.btn_getitem, self.ledit_getitem)
# 添加獲取文本按鈕
self.btn_gettext = QPushButton("Get Text")
self.btn_gettext.clicked.connect(self.get_text)
self.ledit_gettext = QLineEdit()
self.formlayout.addRow(self.btn_gettext, self.ledit_gettext)
# 添加獲取整數(shù)按鈕
self.btn_getint = QPushButton("Get Int")
self.btn_getint.clicked.connect(self.get_int)
self.ledit_getint = QLineEdit()
self.formlayout.addRow(self.btn_getint, self.ledit_getint)
def get_item(self):
"""獲取選項槽"""
items = ("小張", "小明", "小李", "小朱")
item,result = QInputDialog.getItem(self,"獲取選項消息框", "名字列表", items)
print(f"item : {item}, ok : {result}, tpye : {type(result)}")
if item and result:
self.ledit_getitem.setText(item)
def get_text(self):
"""獲取文本槽"""
text,result = QInputDialog.getText(self,"獲取文本消息框", "請輸入文本信息:")
print(f"item : {text}, ok : {result}, tpye : {type(result)}")
if text and result:
self.ledit_gettext.setText(text)
def get_int(self):
"""獲取文本槽"""
num,result = QInputDialog.getInt(self,"獲取整數(shù)消息框", "請輸入整數(shù):")
print(f"item : {num}, ok : {result}, tpye : {type(result)}")
if num and result:
self.ledit_getint.setText(str(num))
if __name__ == "__main__":
"""主程序運行"""
app = QApplication(sys.argv)
window = QInputDialogDemoView()
window.show()
sys.exit(app.exec())結(jié)果:
主界面:

輸入選項:


輸入文本:

輸入整數(shù):

字體對話框
字體對話框(QFontDialog)可以用來交互選擇系統(tǒng)中的字體然后通過返回的QFont類型數(shù)據(jù)來設(shè)置相關(guān)的字體。
font, ok = QFontDialog.getFont()
示例:
# _*_ coding:utf-8 _*_
import sys
from PyQt6.QtWidgets import QApplication
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QFontDialog
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QLabel
from PyQt6.QtWidgets import QVBoxLayout
from PyQt6.QtGui import QFont
from PyQt6.QtCore import Qt
class QFontDialogDemo(QMainWindow):
"""字體對話框"""
def __init__(self):
"""構(gòu)造函數(shù)"""
super(QFontDialogDemo,self).__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("QFontDialogDemo")
self.resize(300, 200)
# 獲取中央控件
self.centralwidget = QWidget()
self.setCentralWidget(self.centralwidget)
# 設(shè)置布局
self.vboxlayout = QVBoxLayout()
self.vboxlayout.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.centralwidget.setLayout(self.vboxlayout)
# 添加標(biāo)簽和按鈕
self.label = QLabel("字體樣式展示")
self.vboxlayout.addWidget(self.label)
self.label_fonttype = QLabel("字體類型")
self.vboxlayout.addWidget(self.label_fonttype)
self.btn_showfontdialog = QPushButton("選擇字體")
self.btn_showfontdialog.clicked.connect(self.getfont)
self.vboxlayout.addWidget(self.btn_showfontdialog)
def getfont(self):
"""獲取字體"""
font, ok = QFontDialog.getFont()
if ok :
self.label.setFont(font)
self.label_fonttype.setText(f"字體名稱:{font.family()},樣式:{font.styleName()},字號:{font.pointSize()}")
if __name__ == "__main__":
"""主程序運行"""
app = QApplication(sys.argv)
main = QFontDialogDemo()
main.show()
sys.exit(app.exec())結(jié)果:
界面樣式:

字體彈窗:

設(shè)置字體后:

顏色對話框
通過顏色對話框(QColorDialog)選擇顏色,然后給給控件設(shè)置對應(yīng)的顏色。
格式:
color, ok = QColorDialog.getColor()
示例:
# _*_ coding:utf-8 _*_
import sys
from PyQt6.QtWidgets import QApplication
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QColorDialog
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QLabel
from PyQt6.QtWidgets import QVBoxLayout
from PyQt6.QtGui import QPalette
from PyQt6.QtCore import Qt
class QColorDialogDemo(QMainWindow):
"""字體對話框"""
def __init__(self):
"""構(gòu)造函數(shù)"""
super(QColorDialogDemo, self).__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("QColorDialogDemo")
self.resize(300, 200)
# 獲取中央控件
self.centralwidget = QWidget()
self.setCentralWidget(self.centralwidget)
# 設(shè)置布局
self.vboxlayout = QVBoxLayout()
self.vboxlayout.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.centralwidget.setLayout(self.vboxlayout)
# 添加標(biāo)簽和按鈕
self.label = QLabel("字體顏色展示")
self.vboxlayout.addWidget(self.label)
self.label_fonttype = QLabel("顏色:")
self.vboxlayout.addWidget(self.label_fonttype)
self.btn_showcolordialog = QPushButton("選擇字體顏色")
self.btn_showcolordialog.clicked.connect(self.getcolor)
self.vboxlayout.addWidget(self.btn_showcolordialog)
self.btn_showcolordialog_background = QPushButton("選擇背景顏色")
self.btn_showcolordialog_background.clicked.connect(
self.getcolor_background)
self.vboxlayout.addWidget(self.btn_showcolordialog_background)
def getcolor(self):
"""獲取顏色"""
color = QColorDialog.getColor()
palette = QPalette()
palette.setColor(QPalette.ColorRole.WindowText, color)
self.label.setPalette(palette)
self.label_fonttype.setText("""顏色:{0:x}""".format(color.rgb()))
def getcolor_background(self):
"""獲取背景顏色"""
color = QColorDialog.getColor()
palette = QPalette()
palette.setColor(QPalette.ColorRole.Window, color)
self.label.setAutoFillBackground(True)
self.label.setPalette(palette)
self.label_fonttype.setText("""顏色:{0:x}""".format(color.rgb()))
if __name__ == "__main__":
"""主程序運行"""
app = QApplication(sys.argv)
main = QColorDialogDemo()
main.show()
sys.exit(app.exec())結(jié)果:
界面:

調(diào)色板:

修改顏色字體:

修改背景顏色:

文件對話框
文件對話框(QFileDialog)用于瀏覽文件并獲取文件路徑。
使用靜態(tài)方法獲取文件路徑
- getSaveFileName(parent: typing.Optional[QWidget] = ..., caption: str = ..., directory: str = ..., filter: str = ..., initialFilter: str = ..., options: 'QFileDialog.Option' = ...) -> typing.Tuple[str, str]: ...
- getOpenFileNames(parent: typing.Optional[QWidget] = ..., caption: str = ..., directory: str = ..., filter: str = ..., initialFilter: str = ..., options: 'QFileDialog.Option' = ...) -> typing.Tuple[typing.List[str], str]: ...
- getOpenFileName(parent: typing.Optional[QWidget] = ..., caption: str = ..., directory: str = ..., filter: str = ..., initialFilter: str = ..., options: 'QFileDialog.Option' = ...) -> typing.Tuple[str, str]: ...
- getExistingDirectoryUrl(parent: typing.Optional[QWidget] = ..., caption: str = ..., directory: QtCore.QUrl = ..., options: 'QFileDialog.Option' = ..., supportedSchemes: typing.Iterable[str] = ...) -> QtCore.QUrl: ...
- getExistingDirectory(parent: typing.Optional[QWidget] = ..., caption: str = ..., directory: str = ..., options: 'QFileDialog.Option' = ...) -> str: ...
示例:
# _*_ coding:utf-8 _*_
import sys
from PyQt6.QtWidgets import QApplication
from PyQt6.QtWidgets import QWidget
from PyQt6.QtWidgets import QMainWindow
from PyQt6.QtWidgets import QFileDialog
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QLabel
from PyQt6.QtWidgets import QLineEdit
from PyQt6.QtWidgets import QFormLayout
from PyQt6.QtGui import QPalette
from PyQt6.QtCore import Qt
class QFileDialogDemo(QMainWindow):
"""字體對話框"""
def __init__(self):
"""構(gòu)造函數(shù)"""
super(QFileDialogDemo, self).__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("QColorDialogDemo")
self.resize(400, 200)
# 獲取中央控件
self.centralwidget = QWidget()
self.setCentralWidget(self.centralwidget)
# 設(shè)置布局
self.formlayout = QFormLayout()
self.formlayout.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.centralwidget.setLayout(self.formlayout)
# 添加標(biāo)簽和按鈕
self.label = QLabel("文件路徑:")
self.ledit_filepath = QLineEdit()
self.formlayout.addRow(self.label, self.ledit_filepath)
self.btn_openfile = QPushButton("打開文件")
self.btn_openfile.clicked.connect(self.openfile)
self.formlayout.addWidget(self.btn_openfile)
def openfile(self):
"""獲取顏色"""
# filename->返回的文件路徑,filetypelist->設(shè)置的要打開的文件類型
filename, filetypelist = QFileDialog.getOpenFileName(
self, "Open File", r"D:\Desktop", "文本文件(*.txt *.csv)")
self.ledit_filepath.setText(filename + ";" + filetypelist)
if __name__ == "__main__":
"""主程序運行"""
app = QApplication(sys.argv)
main = QFileDialogDemo()
main.show()
sys.exit(app.exec())結(jié)果:



實例化對話框獲取文件路徑
實際使用過程中也可以通過自己需求實例化文件對話框后,配置文件對話框?qū)傩?,然后再獲取文件路徑。
filedialog = QFileDialog()
filedialog.setFileMode(QFileDialog.FileMode.AnyFile)
filedialog.setFilter(QDir.Filter.Files)
if filedialog.exec():
filenames = filedialog.selectedFiles()
self.ledit_filepath.setText(filenames[0])到此這篇關(guān)于Python之PyQt6對話框的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python之PyQt6對話框內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python內(nèi)建函數(shù)Built_in Funtions用法示例詳解
這篇文章主要為大家介紹了Python內(nèi)建函數(shù)Built_in Funtions用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Python文件操作和數(shù)據(jù)格式詳解(簡單簡潔)
文本處理是腳本語言的強(qiáng)項,下面這篇文章主要給大家介紹了關(guān)于Python文件操作和數(shù)據(jù)格式的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Python MongoDB 插入數(shù)據(jù)時已存在則不執(zhí)行,不存在則插入的解決方法
這篇文章主要介紹了Python MongoDB 插入數(shù)據(jù)時已存在則不執(zhí)行,不存在則插入的解決方法,結(jié)合實例形式分析了Python基于日志判斷數(shù)據(jù)是否已經(jīng)插入的相關(guān)操作技巧,需要的朋友可以參考下2019-09-09
python?logging多進(jìn)程多線程輸出到同一個日志文件的實戰(zhàn)案例
這篇文章主要介紹了python?logging多進(jìn)程多線程輸出到同一個日志文件的實戰(zhàn)案例,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
Python 機(jī)器學(xué)習(xí)工具包SKlearn的安裝與使用
Sklearn(全稱 SciKit-Learn),是基于 Python 語言的機(jī)器學(xué)習(xí)工具包。本文將簡單的介紹SKlearn安裝與使用,想要入坑機(jī)器學(xué)習(xí)的同學(xué)可以參考下2021-05-05
Python中JSON轉(zhuǎn)換的全面指南與最佳實踐
JSON是現(xiàn)代應(yīng)用程序中最流行的數(shù)據(jù)交換格式之一,Python通過內(nèi)置的json模塊提供了強(qiáng)大的JSON處理能力,本文將深入探討Python中的JSON轉(zhuǎn)換,包括基本用法、高級特性以及最佳實踐,需要的朋友可以參考下2025-03-03

