Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Диалоги в PyQt5 [Урок №6]

Диалоги в PyQt5

Диалоговые окна или диалоги являются незаменимой частью большинства современных графических приложений. Диалог определяется как беседа между двумя и более людьми. В компьютерном приложении, диалог – это окно, которое используется, чтобы «разговаривать» с приложением. Диалог используется для ввода данных, изменения данных, изменения настроек приложения, и т.д.

QInputDialog

QInputDialog обеспечивает простой удобный диалог для получения единственного значения от пользователя. Введённое значение может быть строкой, числом или пунктом из списка.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit, QInputDialog, QApplication)
 
class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        self.initUI()
        
        
    def initUI(self):      
        self.btn = QPushButton('Dialog', self)
        self.btn.move(20, 20)
        self.btn.clicked.connect(self.showDialog)
        
        self.le = QLineEdit(self)
        self.le.move(130, 22)
        
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Input dialog')
        self.show()
        
        
    def showDialog(self):
        text, ok = QInputDialog.getText(self, 'Input Dialog', 'Enter your name:')
        
        if ok:
            self.le.setText(str(text))
        
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Пример имеет кнопку и виджет редактирования строки. Кнопка показывает диалог ввода для получения текстовых значений. Вводимый текст может быть отображён в виджете редактирования строки.

text, ok = QInputDialog.getText(self, 'Input Dialog', 'Enter your name:')

Эта строка показывает диалог ввода. Первая строка – это заголовок диалога, вторая – сообщение внутри диалога. Диалог возвращает введённый текст и логическое значение. Если мы кликаем кнопку «ОК», то логическое значение является правдой.

if ok:
    self.le.setText(str(text))

Текст, который мы получили из диалога, устанавливается в виджет редактирования строки.

Ввод диалога

Рисунок: Ввод диалога

QColorDialog

QColorDialog обеспечивает виджет диалога для выбора цветовых значений.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame, QColorDialog, QApplication)
from PyQt5.QtGui import QColor
 
class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):      
        col = QColor(0, 0, 0) 
        self.btn = QPushButton('Dialog', self)
        self.btn.move(20, 20)
        self.btn.clicked.connect(self.showDialog)
        self.frm = QFrame(self)
        self.frm.setStyleSheet("QWidget { background-color: %s }" % col.name())
        self.frm.setGeometry(130, 22, 100, 100)            
        
        self.setGeometry(300, 300, 250, 180)
        self.setWindowTitle('Color dialog')
        self.show()
        
        
    def showDialog(self):
        col = QColorDialog.getColor()
        if col.isValid():
            self.frm.setStyleSheet("QWidget { background-color: %s }" % col.name())
            
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Пример приложения показывает кнопку и QFrame. Фон виджета устанавливается чёрным цветом. Используя QColorDialog, мы можем менять фон.

col = QColor(0, 0, 0)

Это первоначальный цвет фона QtGui.QFrame.

col = QColorDialog.getColor()

Это строка высветит QColorDialog.

if col.isValid():
    self.frm.setStyleSheet("QWidget { background-color: %s }" % col.name())

Мы проверяем, является ли цвет валидным. Если мы нажимаем кнопку «Cancel», возвращается невалидный цвет. Если цвет валиден, мы меняем цвет фона, используя таблицы стилей (CSS).

QFontDialog

QFontDialog – это виджет диалога для выбора шрифта.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QPushButton, QSizePolicy, QLabel, QFontDialog, QApplication)
 
class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):      
        vbox = QVBoxLayout()
 
        btn = QPushButton('Dialog', self)
        btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        
        btn.move(20, 20)
        vbox.addWidget(btn)
        btn.clicked.connect(self.showDialog)
        
        self.lbl = QLabel('Knowledge only matters', self)
        self.lbl.move(130, 20)
        vbox.addWidget(self.lbl)
        self.setLayout(vbox)          
        
        self.setGeometry(300, 300, 250, 180)
        self.setWindowTitle('Font dialog')
        self.show()
        
    def showDialog(self):
        font, ok = QFontDialog.getFont()
        if ok:
            self.lbl.setFont(font)
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

В нашем примере, мы имеем кнопку и метку. С помощью QFontDialog, мы меняем шрифт метки.

font, ok = QFontDialog.getFont()

Здесь мы высвечиваем диалог со шрифтами. Метод getFont() возвращает имя шрифта и параметр ok. Он равен «Истине», если пользователь кликнул «ОК»; в противном случае, параметр – «Ложь».

if ok:
    self.label.setFont(font)

Если бы мы кликнули «ОК», шрифт метки б изменился.

Диалог со шрифтами

Рисунок: Диалог со шрифтами

QFileDialog

QFileDialog – это диалог, который позволяет пользователям выбирать файлы или папки. Файлы могут быть выбраны и для открытия, и для сохранения.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import (QMainWindow, QTextEdit, QAction, QFileDialog, QApplication)
from PyQt5.QtGui import QIcon
 
class Example(QMainWindow):
 
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):      
        self.textEdit = QTextEdit()
        self.setCentralWidget(self.textEdit)
        self.statusBar()
 
        openFile = QAction(QIcon('open.png'), 'Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open new File')
        openFile.triggered.connect(self.showDialog)
 
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(openFile)       
        
        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('File dialog')
        self.show()
        
    def showDialog(self):
        fname = QFileDialog.getOpenFileName(self, 'Open file', '/home')
        
        f = open(fname, 'r')
        
        with f:        
            data = f.read()
            self.textEdit.setText(data) 
                                
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Пример показывает строку меню, центрально-установленный виджет редактирования текста и строку состояния. Пункт меню показывает QtGui.QFileDialog, который используется для выбора файла. Содержание файла загружается в виджет редактирования текста.

class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        self.initUI()

Пример основывается на виджете QMainWindow, поскольку мы установили по центру виджет редактирования текста.

fname = QFileDialog.getOpenFileName(self, 'Open file', '/home')

Мы высвечиваем QFileDialog. Первая строка в методе getOpenFileName() – это заголовок. Вторая строка указывает диалог рабочей папки. По умолчанию, файловый фильтр установлен в положение «Все файлы (*)».

f = open(fname, 'r')
with f:        
    data = f.read()
    self.textEdit.setText(data)

Выбранное имя файла читается и содержание файла устанавливается в виджет редактирования текста.

Файловый диалог

Рисунок: Файловый диалог

В этой части руководства PyQt5, мы работали с диалогами.

Продолжение: Виджеты PyQt5 [Урок №7]

Прошлый урок: События и сигналы в PyQt5 [Урок №5]

Комментариев: 5
  1. Kosta colaperm@gmail | 2015-06-19 в 11:09:48

    Ubuntu 15.04

    PyQt5.4

    при выполнение QFileDialog

    получаем ошибку :

    Traceback (most recent call last):

    File "dialog_file.py", line 35, in showDialog

    f = open(fname, 'r')

    TypeError: invalid file: ('/home/cola/DS1820B.ini', 'All Files (*)')

    А так же не отрабатывает Ctrl+O

  2. fname = QFileDialog.getOpenFileName(self, 'Open file', '/home')

    Тут на выходе получаем кортеж из пути файла и имени файла.

    Следоватьельно, берем только путь:

    f = open(fname[0], 'r')

    with f:

    data = f.read()

    self.textEdit.setText(data)

  3. Максим | 2018-08-07 в 15:40:53

    При нажатии "open" вылезает диалоговое окно "расположение недоступно" и далее: Файл C:\Users\username\Desktop недоступен....Не пониманию почему именно этот путь и как его поменять, и далее все равно в QTextEdit() содержимое файла не отображается как на скрине, программа просто закрывается

  4. Алексей | 2020-04-12 в 17:06:30

    Бесполезный копипаст с pythonworld, хоть бы указали как перевести диалоги, горе-программисты без ssl

  5. def showDialog(self):

    fname, ok = QFileDialog.getOpenFileName(self, 'Open file', '/home')

    if ok:

    f = open(fname, 'r')

    with f:

    data = f.read()

    self.textEdit.setText(data)